package com.reflex.util; import java.lang.reflect.Field; import java.lang.reflect.Method; /** * Created by Administrator on 2016/7/15. */ public class ReflexUtil { /** * 通过反射获取当前对象的所有方法及方法属性 * * @param object */ public static void getClassMethods(Object object) { Class clazz = object.getClass(); /** * clazz.getMethods() 获取所有非私有的方法,包括继承过来的 * * clazz.getDeclaredMethods() 获取当前类的所有方法包括私有方法,但不包括父类继承的方法 */ Method[] methods = clazz.getMethods(); StringBuffer sb = new StringBuffer(); for (Method method : methods) { //获取方法返回值类型 Class returnType = method.getReturnType(); sb.append(returnType.getName()).append("("); //获取当前方法的所有参数 Class[] parameters = method.getParameterTypes(); if (parameters.length != 0) { //遍历参数数组 for (Class paramterClazz : parameters) { sb.append(paramterClazz.getName()).append(","); } sb.deleteCharAt(sb.length() - 1); } sb.append(")"); System.out.println(sb.toString()); sb.delete(0, sb.length()); } } /*** * 获取当前类的所有属性 包括私有但不包括从父类继承过来的属性 * * * @param object */ public static void getFields(Object object){ Class clazz=object.getClass(); /** * clazz.getFields() 获取该类的所有的非私有方法,包括父类继承过来的 * * clazz.getDeclaredFields() 获取该类的所有方法,包括私有方法,但不包括父类继承过来的方法 */ Field[] fields=clazz.getDeclaredFields(); for (Field field :fields){ System.out.println(field.getType()+" "+field.getName()); } } /** * 通过反射执行object的方法 * @param object */ public static void reflexCallMethod(Object object){ Class clazz=object.getClass(); Method method=null; try { /** * 获取方法对象 * * 参数为方法名,tostring()方法因为没有参数 就可以这么写clazz.getMethod("toString") * * invoke方法的第二个参数为可变参数 通过反射调用的方法有参数时,可以传数组也可以单个单数的传递 * * 数组 * Class[] clazzes=new Class[]{int.class,int.class}; * clazz.getMethod("toString",new Class[]); * * 单个参数 * clazz.getMethod("toString",int.class,int.calss); * */ method=clazz.getMethod("testMethodReflex",int.class,int.class); //通过反射调用testMethodReflex方法 method.invoke(object,10,20); } catch (Exception e) { e.printStackTrace(); } } }
测试类:
package com.reflex.test; import com.reflex.util.ReflexUtil; import org.junit.Test; /** * Created by Administrator on 2016/7/15. */ public class ReflexTest { @Test public void getClassMethod(){ String str="11"; //ReflexUtil.getClassMethods(str); //ReflexUtil.getFields(str); ReflexUtil.reflexCallMethod(new ReflexTest()); } public void testMethodReflex(int a,int b){ System.out.println(a+b); } }