2013-08-31 2 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"); 
method.setAccessible(true); 
method.invoke() 
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(); 
    } 
} 

Если вы могли бы дать нам больше контекста о том, почему вы хотите этого, мы, вероятно, могли бы помочь в поиске лучшего решения.

Смежные вопросы