Java反射获取类的属性值和方法

来源:互联网 发布:在线字体设计软件 编辑:程序博客网 时间:2024/05/17 19:21

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 valuefieldStaticPrivate's valuefieldPublic's valuefieldStaticPublic's valueoperate private method:fieldPrivate's valueoperate private static method:fieldStaticPrivate's valueoperate public methodfieldPublic's valueoperate public static methodfieldStaticPublic's valueoperate hasParameterMethod:param1,param2operate hasParameterMethod:param1,param2,param3,param4,operate hasParameterMethod:param1,param2,param3,param4,




0 0
原创粉丝点击