张孝祥老师视频中有一个用反射把任意一个类中的字符串成员字符a换成字符b的例子。我自己在写的时候出了一些问题,写出来让大家指教一下。
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
class Demo{
public static void main(String[]args) throws Exception{
Exercise e =new Exercise("agree","attack");
Trance(e);
System.out.println("e="+e);
Object obj =new Object();
System.out.println(obj.getClass()==Class.forName("java.lang.Object"));
}
public static void Trance(Object obj) throws Exception{
Field []fields =obj.getClass().getDeclaredFields(); //获取包括隐藏的成员变量
/*
这里要用obj.getClass(),不能用Class.forName("java.lang.Object"),也不能用Objcet.class,
否则就不能将传入参数的字符串成员变量的a改成b,而是把Object类中的字符串成员变量的a改成b
获得Class类的方法有三种,但是这里只能用obj.getClass()这一种方法,因为此时的obj是参数对象,而不是变量。
*/
System.out.println(obj.getClass()==Class.forName("java.lang.Object"));
for(Field field:fields){
field.setAccessible(true); //设置访问权限
if(field.getType()==String.class){
String oldValue =(String)field.get(obj);
String newValue =oldValue.replace('a','b');
field.set(obj,newValue);
}
}
}
}
class Exercise{
public String s1="abc";
private String s2="access";
String s3="basket";
String s4="package";
String s5;
String s6;
int x;
int y;
public Exercise(String s5, String s6) {
super();
this.s5 = s5;
this.s6 = s6;
}
public Exercise(int x,int y){
this.x=x;
this.y=y;
}
@Override
public String toString() {
return "Exercise [s1=" + s1 + ", s2=" + s2 + ", s3=" + s3 + ", s4="
+ s4 + ", s5=" + s5 + ", s6=" + s6 + ", x="+x+", y="+y+"]";
}
}
|
|