java反射获取方法以及调用方法

  • Post author:
  • Post category:java


Class类中获取方法:

public Method[] getMethods();//获取包括自身和继承(实现)过来的所有的public方法——Method不支持泛型<>,即后面不接<>

public Method[] getDeclaredMethods();//获取自身所有的方法(private、public、protected,和访问权限无关),不包括继承的

在jdk1.8后可以直接获取私有属性的方法不需要设置权限 但是仅限于getDeclaredMethod方法  对于Method 的方法仍然需要设置

权限。

public Method[] getMethod(String methodName, Class<T>…parameterTypes);//表示获取指定的一个公共的方法,包括继承的

参数: methodName:表示获取的方法的名字

parameterTypes:表示获取的方法的参数的Class类型

public Method[] getDeclaredMethod(String methodName, Class<T>…parameterTypes);//表示获取本类中的一个指定的方法(private、protected、public,与访问权限无关),不包括继承的方法

1、获取某个类中的方法

public static void main(String args[]) throws Exception {
        Class<?> cls = SysUserClient.class;
//        public Method[] getMethods();//获取包括自身和继承(实现)过来的所有的public方法——Method不支持泛型<>,即后面不接<>
//        public Method[] getDeclaredMethods();//获取自身所有的方法(private、public、protected,和访问权限无关),不包括继承的
        Method methods[] = cls.getDeclaredMethods();
        for (Method met : methods) {
            String res = "";
            int mod = met.getModifiers();
            //先输出方法名字
            res = res + Modifier.toString(mod) + " " + met.getReturnType().getName() + " " + met.getName() +  "(";
            Class<?> params[] = met.getParameterTypes();
            for (int x = 0; x < params.length; x ++) {
                //拼凑出方法要求的数据类型
                res = res + params[x].getName() + " "  + "args-" + x;
                if (x < params.length - 1) {
                    res = res +",";
                }
            }
            res = res + ") ";
            Class<?> exp[] = met.getExceptionTypes();
            if (exp.length > 0) {
                //获取其支持处理的异常信息
                res = res + "throws ";
            }
            for (int x = 0 ; x < exp.length ; x ++) {
                res = res + exp[x].getName();
                if (x < exp.length - 1) {
                    res = res +",";
                }
            }
            System.out.println(res);
            System.out.println(); //换行
        }
    }

获取结果如图

2、java反射调用方法

//    不使用反射机制怎么调用对象?
//    public static void main(String[] args) {
//        SysUserDTO dto = new SysUserDTO();
//        dto.setUserName("吴素");
//        dto.setId(9);
//        dto.setAge("20");
//        dto.setUserEmail("nangong@163.com");
//        HopeRequest hopeRequest = new HopeRequest();
//        hopeRequest.setAppId("zkawTest");
//        hopeRequest.setPublicKey(PUBLIC_KEY_STRING);
//        hopeRequest.setType("list");
//        hopeRequest.setData(JSONObject.toJSONString(dto));
//        String pageModelBaseResponse = SysUserClient.invokeApi(hopeRequest);
//        System.out.println(pageModelBaseResponse);
//    }


//通过反射机制调用对象
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        SysUserDTO dto = new SysUserDTO();
        dto.setUserName("吴素");
        dto.setId(9);
        dto.setAge("20");
        dto.setUserEmail("nangong@163.com");
        HopeRequest hopeRequest = new HopeRequest();
        hopeRequest.setAppId("zkawTest");
        hopeRequest.setPublicKey(PUBLIC_KEY_STRING);
        hopeRequest.setType("list");
        hopeRequest.setData(JSONObject.toJSONString(dto));
        Class clazz  =  SysUserClient.class;
        Method method =  clazz.getDeclaredMethod("invokeApi",new Class[]{HopeRequest.class});
        Object invoke = method.invoke(new SysUserClient(), new Object[]{hopeRequest});
        System.out.println(invoke);
    }

反射机制的作用:让代码很具有通用性,可变化的内容都是写到配置文件当中,将来修改配置文件之后,创建的对象不一样,调用的方法也不同了,但是java代码不需要做任何的改动 。

补充:

getMethod(方法名,Object... args)

invoke(Object obj,Object... args)

可变长参数
     Object... args这就是可变长参数
    语法是:类型...(注意:一定是3个点)
    1.可变长参数要求的参数个数是:0~N个
    2.可变长参数只能有一个,并且必须在参数列表的最后一个位置上
    3.可变长数组可以当做一个数组来看待

3、补充一些关于Java反射的知识

Java反射的作用:在Java代码编译时,可以通过反射访问装载到JVM中类的内部信息。

如: Clazz.getName()获取类的完整名字

getPackage()获取此类所属的包

getSuperclass() 获取父类对应的Class对象

getFiled(String name) 获得类的指定成员变量

getMethods() 获得类的public类型的方法

getMethod(String name, Class[] args) 获取类的指定方法



版权声明:本文为askuld原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。