MST

星途 面试题库

面试题:Java中反射机制如何获取类的私有方法并调用

请详细描述在Java反射机制下,怎样获取一个类中的私有方法,并给出调用该私有方法的示例代码。假设存在一个类`ExampleClass`,里面有一个私有方法`privateMethod`,参数为`String`类型,返回值为`int`类型。
14.5万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 获取私有方法的步骤
    • 使用Class类的getDeclaredMethod方法来获取类中的私有方法。该方法需要传入方法名和方法参数的Class类型数组。
    • 由于是私有方法,需要通过setAccessible(true)来打破Java的访问控制检查,使得可以调用该私有方法。
  2. 示例代码
import java.lang.reflect.Method;

class ExampleClass {
    private int privateMethod(String param) {
        System.out.println("Private method called with param: " + param);
        return param.length();
    }
}

public class ReflectPrivateMethod {
    public static void main(String[] args) {
        try {
            // 获取ExampleClass的Class对象
            Class<?> exampleClass = ExampleClass.class;
            // 获取privateMethod方法,注意第二个参数是方法参数的Class类型
            Method privateMethod = exampleClass.getDeclaredMethod("privateMethod", String.class);
            // 打破访问控制
            privateMethod.setAccessible(true);
            ExampleClass exampleObject = new ExampleClass();
            // 调用私有方法,第一个参数是实例对象,第二个参数是实际传入方法的参数
            int result = (int) privateMethod.invoke(exampleObject, "test");
            System.out.println("Result of private method call: " + result);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

上述代码首先通过ExampleClass.class获取ExampleClassClass对象,然后使用getDeclaredMethod获取privateMethod,通过setAccessible(true)打破访问控制,最后使用invoke方法调用该私有方法并输出结果。如果在获取方法、设置访问权限或调用方法过程中出现异常,会打印异常堆栈信息。