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

时间:2013-08-31 08:02:47

标签: java object reflection methods

假设我有课程:

MyObject b = new MyObject(){
    private void method(){}
}

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

MyObject.class.getMethod("toString");

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

2 个答案:

答案 0 :(得分:8)

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

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

Method method = b.getClass().getDeclaredMethod("method");
method.setAccessible(true);
method.invoke()

答案 1 :(得分:5)

您可以将其用于:

Method method = b.getClass().getDeclaredMethod("method");

这里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();
    }
}

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