1.java的父类如下:
package com.omstarps.test;
public class PrivateObject {
@SuppressWarnings("unused")
private String privateString = null;
public PrivateObject() {
privateString = "Hello World !";
}
}
现在的任务是不修改这个类同时没有set方法的情况下,要对这个类的私有对象访问和修改值。可以通过反射来实现。
2.子类的代码如下:
package com.omstarps.test;
import java.lang.reflect.Field;
public class ChildObject extends PrivateObject {
public void modifyFatherPrivateObjectByReflect() throws NoSuchFieldException, SecurityException,
IllegalArgumentException, IllegalAccessException {
// 得到私有字段
Field privateStringField = PrivateObject.class
.getDeclaredField("privateString");
// 通過反射設置私有對象可以訪問
privateStringField.setAccessible(true);
// 從父類中得到對象,并強制轉換為想要得到的對象
String fieldValue = (String) privateStringField.get(this);
System.out.println("orginal fieldValue = " + fieldValue);
// 將私有對象設置新的值
String str = "New Hello World !";
privateStringField.set(this, str);
String newStr = (String) privateStringField.get(this);
System.out.println("new fieldValue = " + newStr);
}
}
3.测试类如下:
package com.omstarps.test;
public class Test {
public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
ChildObject chileObject = new ChildObject();
chileObject.modifyFatherPrivateObjectByReflect();
}
}
4.总结
java可以通过反射机制访问父类的私有对象,并对父类的私有对象修改和重新设置值。
5.java也可以访问类的私有对象,连接如下:
http://blog.youkuaiyun.com/welcomeem/article/details/18422119