java 反射

来源:互联网 发布:手机淘宝店铺公告设置 编辑:程序博客网 时间:2024/05/16 12:25
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的属性的值。
原创粉丝点击