import java.lang.reflect.Field;
public class ReflectDemo1 {
/**
*
* 将任意对象中的String类型的成员变量所对应的字符串内容中的"b"改成"a"
*/
public static void main(String[] args) {
ReflectDemo2 obj = new ReflectDemo2();
try {
changeString(obj);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(obj);
}
public static void changeString(Object obj) throws Exception {
// 获取该对象的字节码文件
Class c1 = obj.getClass();
// 通过字节码文件获取它的public属性
Field[] f1 = c1.getFields();
// 遍历所有的属性
for (Field field : f1) {
// 判断如果所有属性的字节码和String的字节码相同
if (field.getType() == String.class) {// 用等号,因为用的是同一个字节码文件
// 获取该属性的值
String val = (String) field.get(obj);
// 替换值的字节
String val2 = val.replace('b', 'a');
// 设置新的值
field.set(obj, val2);
}
}
}
}
请问,如果我自定义类的属性是private修饰,这样写还可以吗?或者说必须暴力反射?
|