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