import java.lang.reflect.Field;
import java.util.Arrays;
public class Filed类 {
public static void main(String[] args) {
A a=new A();
System.out.println(a.one);
A.str(a);
System.out.println(a.one);
}
}
class A{
public int a;
public int b;
public String one="aaaaa";
public A(){}
public A(int a, int b) {
super();
this.a = a;
this.b = b;
}
public static void fieldTest(){
A one=new A(1,2);
Field f1=null;
Field f2=null;
try {
A: f1=one.getClass().getField("a");//1.通过A类的字节码获取其指定的Filed的实例.
//2.注意此处得到的成员变量为类的成员变量,f输出为null
//3.此getField方法只能获取公共的成员变量 否则抛出NoSuchFieldException
f2=one.getClass().getDeclaredField("a");//此getDeclaredField方法可以获得任何权限的成员变量
try {
f2.setAccessible(true);//当成员变量为私有是,通过此方法亦可访问。此即为暴力反射
System.out.println(f2.get(one));//此get方法默认条件下只能访问非私有的成员变量否则抛出IllegalAccessException
} catch (IllegalArgumentException e) {
System.out.println("非法参数");
} catch (IllegalAccessException e) {
System.out.println("非法访问异常");
}
} catch (SecurityException e) {
System.out.println("安全异常");
} catch (NoSuchFieldException e) {
System.out.println("没有此成员变量");
}
}
/*
* 该方法可以把任何对象的String类型的成员变量的值中的全部替换成b
*/
public static void str(Object ob) {
Field[] f=ob.getClass().getFields();//该方法获取该类的所有成员变量对象
System.out.println(Arrays.toString(f));
for(Field ff:f){
if(ff.getType()==String.class){//getType方法返回该成员变量的类型与其类型的的字节码返回一致
ff.setAccessible(true);//暴力反射
String str=null;
try {
str = (String)ff.get(ob);//获取该成员变量的值
} catch (IllegalArgumentException e) {
System.out.println("非法参数");
e.printStackTrace();
} catch (IllegalAccessException e) {
System.out.println("非法访问");
}
String str2=str.replace('a', 'b');System.out.println("str:"+str2);
try {
ff.set(ob, str2);//重新设置该成员变量的值
} catch (IllegalArgumentException e) {
System.out.println("非法参数");
e.printStackTrace();
} catch (IllegalAccessException e) {
System.out.println("非法访问");
e.printStackTrace();
}
System.out.println("替换完成");
}else{
System.out.println("无可替换");
}
}
}
}
终于搞定了 不容易 |