1.反射获取属性值,必须是public ??
package com.envision.energy.connective.client;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import com.google.common.base.Predicate;
import com.google.common.collect.FluentIterable;
public class Client {
private Integer test = 2;
public static Integer test2 = 2;
public static Integer getTest2() {
return test2;
}
public static void setTest2(Integer test2) {
Client.test2 = test2;
}
public Integer getTest() {
return test;
}
public void setTest(Integer test) {
this.test = test;
}
public static void main(String[] str) {
Client client = new Client();
Field[] fields = Client.class.getDeclaredFields();
try {
for (Field field : fields) {
field.setAccessible(true);
System.out.println(field.get(client));
}
Field field2 = Client.class.getField("test2");// 可以访问类变量
System.out.println(field2.get(Client.class));
System.out.println(field2.get(client));
Method method = Client.class.getMethod("getTest");//可以通过反射调用method,获取实例字段值
System.out.println("test="+method.invoke(client));
Field field3 = Client.class.getField("test");// 无法访问实例字段
field3.setAccessible(true);
System.out.println(field3.get(client));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
结果:
java.lang.NoSuchFieldException: test
at java.lang.Class.getField(Class.java:1592)
at com.envision.energy.connective.client.Client.main(Client.java:56)
2
2
2
2
test=2