2

假设我有课:

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

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

MyObject.class.getMethod("toString");

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

4

2 回答 2

8

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

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

Method method = b.getClass().getDeclaredMethod("method");
method.setAccessible(true);
method.invoke()
于 2013-08-31T08:05:07.587 回答
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();
    }
}

如果你能给我们更多关于你为什么想要这个的背景信息,我们可能会在寻找最佳解决方案方面提供更多帮助。

于 2013-08-31T08:05:15.130 回答