今天学习RTTI的时候,发现通过反射可以访问私有方法、也可以改变私有变量的值,这样来说的话private 是不是基本没有意义了啊?!
public class User {
private String name;
private int age=25;
public String sex;
private String getName(){
System.out.println("进来获得名字的方法了");
return "yun70345";
}
public String getSex(){
return "man";
}
}
测试类如下:
public class TestMain {
public static Object acessPrivateMethod(Object o,String methodName) throws Exception{
/*获得所有的方法
Method []Methods=o.getClass().getDeclaredMethods();
for (Method method : Methods) {
System.out.println(method.getName());
}
*/
//获得所有属性名字
Field []fields=o.getClass().getDeclaredFields();
for (Field f : fields) {
System.out.println(f.getName());
if(f.getName().equals("age")){
f.setAccessible(true);
f.set(o, 24);//改变私有变量age的值
System.out.println(f.get(o));
}
}
Method m=o.getClass().getDeclaredMethod(methodName);
m.setAccessible(true);
return m.invoke(o);
}
public static void main(String[]args) throws Exception{
User u=User.class.newInstance();
String sex=u.getSex();
System.out.println("性别:"+sex);
System.err.println("使用反射访问私有方法:");
String s=(String) acessPrivateMethod(u,"getName");
System.out.println("名字:"+s);
}
}
分享到:
相关推荐
Java反射访问私有变量和私有方法
C#net反射实现访问类中的私有变量或者方法
原则上,C++类中私有变量不允许在类之外的其他任何地方访问,一般来说功能完善的类都会提供get,set方法来操作类属性值,还有是是通过友元访问。但是!但如果没有get、set方法都没有提供,也没有定义友元,比如使用...
今天小编就为大家分享一篇关于Java对类私有变量的暴力反射技术讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
反射工具类,用来访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数
私有化方法、字段、构造方法都必须破坏封装才能使用: public void setAccessible(boolean flag) true表示破坏封装,false是不破坏 是哪个private修饰的方法、字段、构造方法需要执行,就需要用...
2.反射,暴力反射,和静态做斗争,暴力反射,setAccessible 无论公有私有都可以用来访问 3.动态代理 在调用这个目标方法前,后,2头,异常处都可以动态的加上自己需要逻辑判断,而且根据反射来动态的替换实现类,大大提升了...
访问私有变量 使用反射方式构造对象实例 第 7 章 在测试代码中使用Mock 静态mock,new MockUp的使用 mock构造函数和静态代码块 new MockUp和spring的集成 针对静态mock做断言 动态mock,new Expectations的使用
17.7.3 简化语法3:局部变量不需要手动包装到类中即可传给回调方法 17.8 委托和反射 第18章 定制attribute 18.1 使用定制attribute 18.2 定义自己的attribute类 18.3 attribute的构造器和字段/属性的数据类型 ...
特征支持功能补丁支持成员方法的补丁支持接口补丁支持功能变量的补丁支持全局变量的补丁支持功能指定顺序的补丁支持成员方法指定序列的补丁支持接口指定顺序的补丁支持功能变量指定序列的补丁笔记如果启用了内联,go...
将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载 finally?再异常处理时...
240 12.2.1 创建局部内部类 240 12.2.2 在局部内部类中访问外部类成员变量 240 12.2.3 在局部内部类中访问外部类的局部变量 241 12.2.4 静态方法中的局部内部类 243 12.3 静态内部类 244 12.3.1 创建静态内部类 244 ...
2.3.1 属性——合理冲破私有变量访问限制 2.3.2 动手——从宿主程序开始 2.4 框架通信契约设计 2.4.1 IPlugin接口 2.4.2 ICommand接口 2.4.3 ITool接口 2.4.4 IItemDef接口和实现 2.4.5 IMenuDef接口 2.4.6...
17.7.3 简化语法3:局部变量不需要手动包装到类中即可传给回调方法 17.8 委托和反射 第18章 定制attribute 18.1 使用定制attribute 18.2 定义自己的attribute类 18.3 attribute的构造器和字段/属性的数据类型 ...
17.7.3 简化语法3:局部变量不需要手动包装到类中即可传给回调方法 17.8 委托和反射 第18章 定制attribute 18.1 使用定制attribute 18.2 定义自己的attribute类 18.3 attribute的构造器和字段/属性的数据类型 ...
17.7.3 简化语法3:局部变量不需要手动包装到类中即可传给回调方法 17.8 委托和反射 第18章 定制attribute 18.1 使用定制attribute 18.2 定义自己的attribute类 18.3 attribute的构造器和字段/属性的数据类型 ...
private : 私有成员, 在类的内部才可以访问。 protected : 保护成员,该类内部和继承类中可以访问。 public : 公共成员,完全公开,没有访问限制。 internal: 在同一命名空间内可以访问。 2 .列举ASP.NET 页面...