楼主静态程序中的toChange方法中getFields()获取的是字节码中反映此 Class 对象所表示的类或接口的所有可访问公共字段,即被public 修饰的属性
在ReflectPoint 中 的属性只有st1是public类型,st2是默认属性 所以用getFields()只能获取st1
要想获取到非公共的字段可以用getDeclaredFields()获取此Class所声明的所有字段
只需修改toChange()方法即可,如下测试通过
public static void toChange(Object obj) throws Exception {
Field [] fields = obj.getClass().getDeclaredFields();
for(Field field : fields){
if(field.getType() == String.class){
String oldField = (String)field.get(obj);
String newField = oldField.replace('b', 'a');
field.set(obj, newField);
}
楼上所说的暴力是对私有private变量来说的,要field.setAccessible(true);使其可见 其他类型可以不需要楼主可测试下 |