要通过反射调用Java类中的方法,你可以按照以下步骤操作:
-
获取
Class
对象:这可以通过类的全名使用Class.forName()
来完成。 -
从
Class
对象中获取Method
对象:通过Class
对象的getMethod()
或getDeclaredMethod()
方法获取指定方法的Method
对象。getMethod()
用于获取公共方法,getDeclaredMethod()
可以获取类中声明的所有方法,包括私有的(private)、保护的(protected)、默认访问级别(package-private)的和公共的(public)方法。 -
如果需要,创建或者获取一个实例:如果方法是实例方法,你需要一个类的实例来调用它。如果方法是静态的(static),则可以跳过这一步。
-
调用方法:使用
Method
对象的invoke()
方法调用它,传入实例和所需的参数。
以下是一个使用反射调用类方法的简单示例:
try {
// 指定类名
String className = "com.example.MyClass";
// 指定方法名
String methodName = "myMethod";
// 获取Class对象实例
Class<?> myClass = Class.forName(className);
// 获取Method对象实例,对于无参方法
Method method = myClass.getMethod(methodName);
// 调用一个实例方法,需要类的一个实例
Object instance = myClass.newInstance();
// 调用方法
// 如果是无参方法调用,传入实例和null
// 如果是实例方法,第一个参数传实例
// 如果是静态方法,第一个参数传null
// 后面的参数是实际调用方法的参数
Object result = method.invoke(instance);
// 处理调用结果(如果方法有返回值)
System.out.println(result);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
// 获取被调用方法抛出的异常
Throwable cause = e.getCause();
cause.printStackTrace();
}
若方法有参数,则需要提供参数的类型来获取Method
对象,同时在invoke()
中传入相应参数:
// 参数类型
Class<?>[] parameterTypes = new Class<?>[] { String.class, int.class };
// 获取Method对象实例,对于有参方法
Method method = myClass.getMethod(methodName, parameterTypes);
// 传入实例和参数
Object result = method.invoke(instance, "Hello", 123);
请注意,newInstance()
方法在Java 9及其之后版本中已标记为过时,推荐方式是使用来自Constructor
类的newInstance()
方法。而且,如果你要调用的方法是私有的,你需要在Method
对象上调用setAccessible(true)
方法来覆盖Java的访问控制检查。