如何从匿名类访问私有方法?

Che*_*rry 2 java reflection methods object

假设我上课:

MyObject b = new MyObject(){
    private void method(){}
}
Run Code Online (Sandbox Code Playgroud)

是否可以通过反射获得method()?对于toString我可以写:

MyObject.class.getMethod("toString");
Run Code Online (Sandbox Code Playgroud)

但是对于新创建的私有方法呢?

Roh*_*ain 8

您必须Object#getClass()b引用时调用以获取声明方法的匿名类.MyObject.class会给你Class<MyObject>,这可能不是你想要的.

然后Class#getDeclaredMethod()用来获取私有方法:

Method method = b.getClass().getDeclaredMethod("method");
method.setAccessible(true);
method.invoke()
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 5

您可以使用它:

Method method = b.getClass().getDeclaredMethod("method");
Run Code Online (Sandbox Code Playgroud)

这里b.getClass()将返回编译器为匿名内部类生成的类.

然而,我无法想象这种情况是一种好方法.

请注意,如果使用本地命名类,则甚至不需要使用反射来调用该方法:

public class Test {
    public static void main(String[] args) {
        class Foo {
            private void doSomething() {
                System.out.println("Yes!");
            }
        };

        Foo foo = new Foo();
        foo.doSomething();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你能给我们更多关于你为什么想要这个的背景,我们可能会更有助于找到最好的解决方案.