import java.lang.reflect.*; class Student{ private static int x = 3; private int y =9; public static int z = 18; public int n = 27; } public class TestReflect{ public static void main(String args[]){ printInstanceInfo(new Student()); } public static void printInstanceInfo(Object obj){ Class cl = obj.getClass(); String r = cl.getName()+"["; Field fields[] = cl.getDeclaredFields(); //这个地方写错了 AccessibleObject.setAccessible(fields,true); //已经设置了取消访问检查,为何前两个私有变量还输不出来呢? for(Field f : fields){ if(!r.endsWith("[")){ r += ","; } r += f.getName() + "="; try{ Object o = f.get(obj); r += o; }catch(Exception e){ e.printStackTrace(); } } r += "]"; System.out.println(r);
改为Field fields[] = getDeclaredFields();
for(fields : field) {
field.setAccesible(true);
}
估计就能够访问私有变量了
class Student{
private static int x = 3;
private int y =9;
public static int z = 18;
public int n = 27;
}
public class TestReflect{
public static void main(String args[]){
printInstanceInfo(new Student());
}
public static void printInstanceInfo(Object obj){
Class cl = obj.getClass();
String r = cl.getName()+"[";
Field fields[] = cl.getDeclaredFields(); //这个地方写错了
AccessibleObject.setAccessible(fields,true);
//已经设置了取消访问检查,为何前两个私有变量还输不出来呢?
for(Field f : fields){
if(!r.endsWith("[")){
r += ",";
}
r += f.getName() + "=";
try{
Object o = f.get(obj);
r += o;
}catch(Exception e){
e.printStackTrace();
}
}
r += "]";
System.out.println(r);
}
}
你写成Field fields[] = cl.getFields();
你写的方法只能拿到public的字段,你查查API。
问题解决,给分,谢谢。
getDeclaredFields();才能返回所有属性,包括private属性