java反射 setAccess,Java反射 - setAccessible的影响(真)Java反射 - setAccessib
我使用了一些注释动态设置在类字段的值。 因为我想做到这一点,无论它是公共的,保护的,还是私人的,我是一个呼叫setAccessible(true)每次Field对象上调用之前set()方法。 我的问题是什么样的影响呢的setAccessible()调用已经在球场上本身?
更具体地讲,说这是一个私人领域,这组代码调用setAccessible(true) 。 如果代码中的其他地方是那么地检索通过反射同场,将现场已经可以访问? 抑或是getDeclaredFields()和getDeclaredField()方法每次返回Field对象的新实例?
我想提出这个问题的另一种方式是,如果我叫setAccessible(true) ,是多么重要的是它设置回原始值,我做了之后?
Answer 1:
随着setAccessible()更改的行为AccessibleObject ,即Field实例,而不是类的实际领域。 这里的文档 (节选):
的值true表明,当它被使用的反射对象应该抑制为Java语言访问控制检查
和一个可运行的例子:
public class FieldAccessible {
public static class MyClass {
private String theField;
}
public static void main(String[] args) throws Exception {
MyClass myClass = new MyClass();
Field field1 = myClass.getClass().getDeclaredField("theField");
field1.setAccessible(true);
System.out.println(field1.get(myClass)); // no exception
Field field2 = myClass.getClass().getDeclaredField("theField");
System.out.println(field2.get(myClass)); // IllegalAccessException
}
}
Answer 2:
该getDeclaredField方法每次都返回一个新的对象,正是因为这个对象具有可变的accessible标志。 所以,没有必要重新设置标志。 你可以找到的全部细节这个博客帖子 。
Answer 3:
正如其他海报指出, setAccessible只适用于你的那个实例java.lang.reflect.Field ,所以设置无障碍设施恢复到原来的状态是没有必要的。
然而...
如果您想您的通话field.setAccessible(true)是持久性的,你需要使用下面的方法java.lang.Class和java.lang.reflect.Field 。 面向公众的方式发送给您的副本 Field实例,因此它“忘记”以后每次做类似class.getField(name)
import java.lang.reflect.*;
import sun.reflect.FieldAccessor;
public class Reflect {
private static Method privateGetDeclaredFields;
private static Method getFieldAccessor;
public static Field[] fields(Class> clazz) throws Exception {
return (Field[]) privateGetDeclaredFields.invoke(clazz, false);
}
public static T get(Object instance, Field field) throws Exception {
return ((FieldAccessor) getFieldAccessor.invoke(field, instance)).get(instance);
}
public static void set(Object instance, Field field, Object value) throws Exception {
((FieldAccessor) getFieldAccessor.invoke(field, instance)).set(instance, value);
}
static {
try {
// These are used to access the direct Field instances instead of the copies you normally get through #getDeclaredFields.
privateGetDeclaredFields = Class.class.getDeclaredMethod("privateGetDeclaredFields", boolean.class);
privateGetDeclaredFields.setAccessible(true);
getFieldAccessor = Field.class.getDeclaredMethod("getFieldAccessor", Object.class);
getFieldAccessor.setAccessible(true);
} catch (Exception e) {
// Should only occur if the internals change.
e.printStackTrace();
}
}
}
Answer 4:
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class PrivateVariableAcc {
public static void main(String[] args) throws Exception {
PrivateVarTest myClass = new PrivateVarTest();
Field field1 = myClass.getClass().getDeclaredField("a");
field1.setAccessible(true);
System.out.println("This is access the private field-"
+ field1.get(myClass));
Method mm = myClass.getClass().getDeclaredMethod("getA");
mm.setAccessible(true);
System.out.println("This is calling the private method-"
+ mm.invoke(myClass, null));
}
}
文章来源: Java reflection - impact of setAccessible(true)
java反射 setAccess,Java反射 - setAccessible的影响(真)Java反射 - setAccessib相关推荐
- java 获取所有带指定注解的类名_SXT DAY023 反射和注解
1. 反射机制介绍_Class对象获取 反射机制是 Java 的动态性之一 动态语言:在程序运行时,可以改变程序的结构或变量的 类型. 反射机制的常见作用 动态的加载类.动态的获取类的信息(属性,方法 ...
- java 反射父类私有属性值_如何在Java中通过反射访问父类的父类的私有字段? - java...
在一个API中,我使用的是一个抽象类(A类),该类具有一个私有字段(A.privateField). B类在API中扩展了A类. 我需要扩展B类的实现,即C类,但是我需要A类的privateField ...
- Java 反射?反射有什么缺点?你是怎么理解反射的(为什么框架需要反射)?
ava Java 基础这部分一些简单的问题就直接没有放上来. 需要资料的朋友麻烦一键三连之后点此免费获取! 基础: Java 反射?反射有什么缺点?你是怎么理解反射的(为什么框架需要反射)? 谈谈对 ...
- java 反射类 spring_学习Spring必学的Java基础知识(1)----反射
引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...
- java 反射机制 视频_【视频笔记】Java反射机制笔记
Java 语言的反射机制 在Java运行时环境中,对于任意一个类,可以知道这个类有哪些属性和方法.对于任意一个对象,可以调用它的任意一个方法. 这种动态获取类的信息以及动态调用对象的方法的功能来自于J ...
- java后端技术路线_Java后端精选技术:Java的反射机制
反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. ...
- java 里面怎么截取倒数第几个字_Java反射是什么
前言 Java的反射特性是一项非常强大和有用的功能,它使得我们可以轻松的在运行时观察到类实例的内部状态,并且可以动态的操作实例,从而为Java语言提供更多更灵活的想象空间.随便举几个例子:使用反射可以 ...
- 什么叫做类的类?如何获取私有的方法?Java反射机制太强大了,详解Java反射机制【Java养成】
Java学习打卡:第二十二天 内容导航 Java学习打卡:第二十二天 内容管理 Java反射机制 问题引入---数据库介绍 Java反射的介绍 class的使用 由字符串产生类和对象 获取一个类的所有 ...
- Java 8 自动装箱拆箱效率影响测试
Java 8 自动装箱拆箱效率影响测试 测试完毕之后的结论: 1. 装箱发生 232−12^{32-1}232−1 次的时候影响时间大概为10秒 2. 拆箱发生 232−12^{32-1}23 ...
- 超有霸气的,有影响力的Java/C++/ASP.NET面试题
1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过程抽象,二 ...
最新文章
- 孙正义的软银愿景宫斗内幕:印度裔高管争宠,黑公关手段,设局桃色仙人跳...
- ASP.NET2.0_执行页面发送的强类型方法与弱类型方法
- 给jdk写注释系列之jdk1.6容器(1):ArrayList源码解析
- bootstrap-进度条
- [bzoj1050 HAOI2006] 旅行comf (kruskal)
- 列出一个目录中所有文件及大小
- arcgispython空间插值_基于python的空间距离权重计算——arcgis中的arcpy
- php css 编译,LAMP环境搭建之php安装
- SQL 2012安装、配置路径
- (转)曹锋、宋天玮:区块链技术在证券市场中的应用探索
- 【Vue: 使用pdf.js顯示PDF Viewer】
- u盘写保护+计算机管理,取消u盘写保护的操作方法-电脑自学网
- 高校毕业生就业信息管理系统的设计与实现(Spring + Spring MVC +Hibernate)
- 写在博士旅程之前|博士第一年|博士第三年|博士第四年
- php 队列管理器,Horizon 队列管理工具
- 利用HttpWebRequest自动抓取51la统计数据
- HTML5+CSS3小实例:不偷看密码的超萌猫头鹰登录界面
- Win10使用Ctrl+Space切换输入法
- Nginx 性能优化 Gzip 压缩配置
- 人脸识别损失函数梳理与分析/相关方法整理
热门文章
- STM32系列单片机SPI速度研究(flash读取写入速度提高,液晶显示屏刷新率提高)
- ssm商城系统html模块,jsp+ssm+mysql实现的【在线商城系统】毕设思路指导及模板文档...
- 万月薪的英语人是如何练成的!!!讲一口漂亮流利的英语[转]
- 工作总结汇报该怎么写,才能让上司满意
- 三星手机显示app无网络连接到服务器,三星应用商店发生错误?三星应用商店无法连接网络怎么办?[图]...
- 微软计算器的用法 英文单词
- Java如何自定义异常?
- 在link.c中已经include了头文件了,为什么使用ld还无法识别mian和printf?
- 最小yaffs2文件系统移植(目标板TQ2440)
- 微信小程序模板消息限制,实现无限制主动推送