JavaSE 反射 Part1

来源:互联网 发布:excel编程vba 编辑:程序博客网 时间:2024/06/07 17:49

原作者:尚硅谷-佟刚


这里写图片描述
这里写图片描述
这里写图片描述


package com.atweihai.reflection;import java.lang.reflect.Method;import org.junit.Test;public class ReflectionTest {    @Test    public void testReflection() throws Exception{        //测试子类私有方法        String className="com.atweihai.reflection.Student";        String methodName="method2";        Class clazz=Class.forName(className);        Method method=getMethod(clazz, methodName);        invokeMethod(clazz, method);        //测试父类私有Person 方法        className="com.atweihai.reflection.Student";        methodName="method1";        Object[] args={"北京",24};        clazz=Class.forName(className);        Class[] parameterTypes=getParameterTypes(args);        method=getMethod(clazz, methodName, parameterTypes);        Object obj=invokeMethod(clazz, method, args);        System.out.println(obj);    }    //执行方法    public Object invokeMethod(Class clazz,Method method,Object ... args) throws Exception{        //使私有方法变为可访问的        method.setAccessible(true);        return method.invoke(clazz.newInstance(), args);    }    //获取方法    public Method  getMethod(Class clazz,String methodName,Class ... parameterTypes){        Method method=null;         //循环向上转型        for(;clazz!=Object.class;clazz=clazz.getSuperclass()){              try {                method=clazz.getDeclaredMethod(methodName, parameterTypes);                return method;            } catch (Exception e) {}        }        return method;    }    //获取参数类型的Class数组    private Class[] getParameterTypes(Object[] args) {        Class[] parameterTypes=new Class[args.length];        for(int i=0;i<args.length;i++){            parameterTypes[i]=args[i].getClass();        }        return parameterTypes;    }}
原创粉丝点击