java代码中,常常将一个类的成员变量置为private
在类的外面获取此类的私有成员变量的value时,需要注意:
测试类:
public class AccessibleTest {
private int id;
private String name;
public AccessibleTest() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Main类:
public class Main {
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("com.test.accessible.AccessibleTest");
AccessibleTest at = new AccessibleTest();
at.setId(1);
at.setName("AT");
for (Field f : clazz.getDeclaredFields()) {
f.setAccessible(true);//AccessibleTest类中的成员变量为private,故必须进行此操作
System.out.println(f.get(at));//获取当前对象中当前Field的value
}
}
}
如果没有在获取Field之前调用setAccessible(true)方法,异常:
java.lang.IllegalAccessException:
Class com.test.accessible.Main
can not access
a member of class com.test.accessible.AccessibleTest
with modifiers "private"
当然在AccessibleTest类的内部(AccessibleTest的内部类除外)
进行如上操作则不需要调用setAccesible()方法
分享到:
相关推荐
一般情况下,我们并不能对类的私有字段进行操作,利用反射也不例外,但有的时候,例如要序列化的时候,我们又必须有能力去处理这些字段,这时候,我们就需要调用AccessibleObject上的setAccessible()方法来允许这种...
Team23选1·普通:编程实现利用反射获取类信息· 中等:利用setAccessible方法禁止访问类中私有属性和方法(获取不到私有属性和方法)· 地狱:利用
创建ExceptionTest类,在该类的main()方法中,使用反射获得String类的所有域,不要使用setAccessible方法修改这些域的可见性,然后通过反射获得私有域中与”hash”相匹配的int值,并使用try-catch语句块捕获非法访问...
Method[] methods = clazz.getDeclaredMethods() 获取任意访问权限所有造方法数组,并且都是自己的方法 Method method = clazz.getMethod(String methodName,Class... 参数字节码)根据方法名和参数类型...
2.反射,暴力反射,和静态做斗争,暴力反射,setAccessible 无论公有私有都可以用来访问 3.动态代理 在调用这个目标方法前,后,2头,异常处都可以动态的加上自己需要逻辑判断,而且根据反射来动态的替换实现类,大大提升了...
行前调用上述方法: cts[i].setAccessible(true); 这样就可以创建只有构造函数的实例、调用私有构造方法,访问类的私有属性。 呵呵,这样好像java安全性就大大降低.如果你非常注重应用的安全性,java当然考虑到这...
@SuppressWarnings("deprecation") //在mian方法内调用一个没有定义的方法时,运行的时候将会出现这一注解! public static void main(String [] args) { Test.sayHello(); } } @SuppressWarnings 批注允许您...
Permit.setAccessible启用对Field或Method访问,而无需考虑模块 Permit.godMode将所有模块中的所有软件包打开到所有模块 Permit.main在上帝模式下运行指定类的main方法。 这应该允许许多Java 8程序与Java的更高版本...
使用网上普遍的方法,反射TabLayout 1、写个工具类 封装: public class TabLayoutUtils { public static void setIndicator(TabLayout tabs, int leftDip, int rightDip, int bottomDip) { Class<?> ...
= null) { menuKeyField.setAccessible(true); menuKeyField.setBoolean(mconfig, false); } } catch (Exception ex) { }2、Action Bar自定义样式之前Action Bar是不兼容3.0以下的,有开源的actionbarsherlock可以...