Java反射获取类的属性值和方法
结论:
1.获取私有属性与私有方法的时候,需要设置允许访问。
2.获取静态属性与静态方法的时候,不需要给类的实例。
Entity类代码:
public class Entity {
private String fieldPrivate;
private static String fieldStaticPrivate;
public String fieldPublic;
public static String fieldStaticPublic;
private String operateWithFieldPrivate(){
return "operate private method:"+ fieldPrivate;
}
private static String operateWithFieldStaticPrivate(){
return "operate private static method:"+ fieldStaticPrivate;
}
public String operateWithFieldPublic(){
return "operate public method"+fieldPublic;
}
public static String operateWithFieldStaticPublic(){
return "operate public static method"+fieldStaticPublic;
}
public String hasParameterMethod(String param1,String param2){
return "operate hasParameterMethod:"+param1+","+param2;
}
public String hasChangeableParameterMethod(Object... objects){
StringBuilder result=new StringBuilder();
for(Object obj:objects){
result.append(obj.toString()).append(",");
}
return "operate hasParameterMethod:"+result;
}
}
ReflectTest类代码:
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ReflectTest{
public static void main(String[] args) {
try{
Class clazz=Entity.class;
Object entity= clazz.newInstance();
//获取变量
Field fieldPrivate=clazz.getDeclaredField("fieldPrivate"),
fieldStaticPrivate=clazz.getDeclaredField("fieldStaticPrivate"),
fieldPublic=clazz.getDeclaredField("fieldPublic"),
fieldStaticPublic=clazz.getDeclaredField("fieldStaticPublic");
//获取方法
Method operateWithFieldPrivate=clazz.getDeclaredMethod("operateWithFieldPrivate"),
operateWithFieldStaticPrivate=clazz.getDeclaredMethod("operateWithFieldStaticPrivate"),
operateWithFieldPublic=clazz.getDeclaredMethod("operateWithFieldPublic"),
operateWithFieldStaticPublic=clazz.getDeclaredMethod("operateWithFieldStaticPublic"),
hasParameterMethod=clazz.getDeclaredMethod("hasParameterMethod",new Class[]{String.class,String.class}),
hasChangeableParameterMethod=clazz.getDeclaredMethod("hasChangeableParameterMethod",Object[].class);
//私有属性
fieldPrivate.setAccessible(true);
fieldPrivate.set(entity, "fieldPrivate's value");
System.out.println(fieldPrivate.get(entity));
//静态私有属性
fieldStaticPrivate.setAccessible(true);
fieldStaticPrivate.set(null, "fieldStaticPrivate's value");
System.out.println(fieldStaticPrivate.get(null));
//公共属性
fieldPublic.set(entity, "fieldPublic's value");
System.out.println(fieldPublic.get(entity));
//公共静态属性
fieldStaticPublic.set(null, "fieldStaticPublic's value");
System.out.println(fieldStaticPublic.get(null));
//私有方法
operateWithFieldPrivate.setAccessible(true);
System.out.println(operateWithFieldPrivate.invoke(entity));
//私有静态方法
operateWithFieldStaticPrivate.setAccessible(true);
System.out.println(operateWithFieldStaticPrivate.invoke(null));
//公共方法
System.out.println(operateWithFieldPublic.invoke(entity));
//公共静态方法
System.out.println(operateWithFieldStaticPublic.invoke(null));
//带固定参数的方法
System.out.println(hasParameterMethod.invoke(entity, new String[]{"param1","param2"}));
//带可变长度参数的方法1---------等同于数组
//使用new Object[]{"param1","param2","param3","param4"},原因是因为编译器会以为
//有4个入参,但实际只有一个入参
Object[] objects={"param1","param2","param3","param4"};
System.out.println(hasChangeableParameterMethod.invoke(entity, new Object[]{objects}));
//带可变长度参数的方法2----------等同于数组
Object arrayObj = Array.newInstance(Object.class, 4);
Array.set(arrayObj, 0, "param1");
Array.set(arrayObj, 1, "param2");
Array.set(arrayObj, 2, "param3");
Array.set(arrayObj, 3, "param4");
System.out.println(hasChangeableParameterMethod.invoke(entity, arrayObj));
}catch(Exception e){
e.printStackTrace();
}
}
}
结果:
fieldPrivate's value
fieldStaticPrivate's value
fieldPublic's value
fieldStaticPublic's value
operate private method:fieldPrivate's value
operate private static method:fieldStaticPrivate's value
operate public methodfieldPublic's value
operate public static methodfieldStaticPublic's value
operate hasParameterMethod:param1,param2
operate hasParameterMethod:param1,param2,param3,param4,
operate hasParameterMethod:param1,param2,param3,param4,