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