概述
通过反射可以获取某类的 成员方法 信息,成员方法 对应的类是 Method 类,成员方法 的信息封装在 Method 类对象中
获取 Method 类对象
通过Class类的以下方法:
getMethod(String name, Class...<?> parameterTypes)获得该类某个公有的方法getMethods()获得该类所有公有的方法getDeclaredMethod(String name, Class...<?> parameterTypes)获得该类某个方法getDeclaredMethods()获得该类所有方法
Method 类常用方法
例子: 打印成员方法信息
定义Student4类,方法抛出Exception,无意义,只是为了学习
public class Student4 {
public void study(String lesson) throws Exception{
System.out.println("学习 "+lesson);
}
}
测试类
public class Test4 {
public static void main(String[] args) {
try {
printMethodInfo("reflect.Student4");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
static void printMethodInfo(String className) throws ClassNotFoundException {
Class cls=Class.forName(className);
System.out.println("成员方法:");
Method[] methods=cls.getDeclaredMethods();
for(Method m:methods){
System.out.println(m.getName());
System.out.println("形参类型:");
// 获取所有参数类型
Class[] parameterTypes = m.getParameterTypes();
for (Class p:parameterTypes) {
System.out.println(" " + p.getSimpleName());
}
System.out.println("拋出异常:");
// 获取所有可能拋出的异常类型
Class[] exceptionTypes = m.getExceptionTypes();
for (Class e:exceptionTypes) {
System.out.println(" " + e.getSimpleName());
}
}
}
}
动态创建对象,并调用方法
应用场景:
- 实例化Servlet
- java框架,如:Mybatis、spring
例子
定义Student4类,方法抛出Exception,无意义,只是为了学习
public class Student4 {
public void study(String lesson) throws Exception{
System.out.println("学习 "+lesson);
}
}
测试类
public class Test41 {
public static void main(String[] args) {
try {
call("reflect.Student4");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
static void call(String className) throws ClassNotFoundException, InvocationTargetException, IllegalAccessException, InstantiationException {
Class cls=Class.forName(className);
Constructor[] cons=cls.getDeclaredConstructors();
Object obj=cons[0].newInstance();
Method[] methods=cls.getDeclaredMethods();
methods[0].invoke(obj,"《java从入门到上天》");
}
}
https://www.jianshu.com/p/9be58ee20dee
