java 反射

Java代码 
  1. public class ReadOnlyClass {  
  2.         private String name = "hello";  
  3.     public String getName(){  
  4.         return name;  
  5.     }  
  6. }  

问题:能否将ReadOnlyClass 类的一个对象,把它的name属性的值由hello改为world?如果能,请写出实现代码。如果不能请说明理由。 
解答:可以。利用java的反射。 
分析:任何一个类,我们可以得到它运行时的Class实例,对于ReadOnlyClass 类,我们可以通过ReadOnlyClass .class得到它运行时的Class实例,接着我们可以通过该类的Class实例去获得这个name这个属性所对应的Field对象。我们知道对应一个 类的属性都有一个和它相关的Field对象存在,对于构造方法来说有一个Constructor对象存在,对于一个方法来说有一个对应的Method对象 存在。通过这些我们可以利用发射来给这些属性动态的赋值。
实现代码如下: 
Java代码 
  1. public class ReadOnlyClassByReflection {  
  2.     public static void main(String[] args)throws Exception {  
  3.         ReadOnlyClass  pt = new ReadOnlyClass();  
  4.         Class<?> clazz = ReadOnlyClass.class;  
  5.         Field field = clazz.getDeclaredField("name");  
  6.         field.setAccessible(true);  
  7.         field.set(pt, "world");  
  8.         System.out.println(pt.getName());  
  9.     }  
  10. }  
总结:对于一个类,它只有唯一的一个Class对象,它来标识这个对象。这个Class对象就能够获得这个类的结构上的特征。那么通过class对象就可以来获得这个类相应的构造方法,属性等。 
    获得某一个类它的class对象有4种方式: 
    1、使用类的.class语法 
    2、通过类的对象的getClass()方法。getClass()方法在Object类里面定义的。 
    3、通过Class对象的forName()方法 
    4、对于包装类,可以通过.TYPE语法方式 
    通过类的反射机制,我们可以去改变只读的private的属性的值。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值