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) 获取类的指定方法