2015-05-03 5 views
1

Если я создаю анонимный класс с помощью частного метода и попытаюсь получить доступ к методу с использованием отражения, он выкинет исключение IllegalAccessException. Однако, если я вызываю метод объекта перед сохранением его в переменной, она отлично работает:Анонимные классы, частные методы и отражение

public class Z { 
    public static void main(String[] args) throws Exception { 

     Object obj = new Object(){private void foo(){}};    
     obj.getClass().getDeclaredMethod("foo").invoke(obj); // throws IllegalAccessException 

     new Object(){private void foo(){}}.foo(); // works 
    } 
} 

Что причиной разницы?

ответ

3

В первом случае вы пытаетесь получить доступ к методу путем отражения, и поскольку это частный метод, класс отражателя не может его вызывать, поэтому он выдает IllegalAccessException.

Во втором случае вы напрямую обращаетесь к этому методу, и вам разрешено, поскольку он является анонимным внутренним классом до Z, и вы получаете доступ к нему внутри класса Z.

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

  • Нет связанных вопросов^_^