2013-08-31 35 views
1

假設我有類:如何訪問匿名類的私有方法?

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

是否有可能獲得通過反射法()?對於toString我可以這樣寫:

MyObject.class.getMethod("toString"); 

但是對於新創建的私有方法呢?

回答

7

您必須調用Object#getClass()b引用才能獲取聲明該方法的匿名類。 MyObject.class會給你Class<MyObject>,這可能不是你想要的。

然後用Class#getDeclaredMethod()獲得私有方法:

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

這裏b.getClass()將返回爲您生成的匿名內部編譯器類:

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

你可以使用它類。

但是,我不能輕易想象出這是一種很好的方法。

請注意,如果您使用本地名爲類,你甚至不需要使用反射來調用方法:

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

     Foo foo = new Foo(); 
     foo.doSomething(); 
    } 
} 

如果你可以給我們介紹一下你爲什麼要這樣更多的上下文,我們可能會在尋找最佳解決方案方面提供更多幫助。