получение IllegalAccessException при доступе к защищенному методу от родителя из внутреннего класса - PullRequest
0 голосов
/ 11 июня 2010

У меня очень странная проблема и странное решение:

class Parent {
    protected void aProtectedMethod() { doSomething(); }
} 

class Child extends Parent {
    void anotherMethod() {
      new SomeInterface() {
          public void interfaceMethod() {
              aProtectedMethod();
          }
      };
    }
}

Когда запускается child.anotherMethod (), я получаю IllegalAccessException в myProtectedMethod (), говоря, что мой внутренний класс не имеет доступа к родительскому классу ...

Однако, если я добавлю:

protected void aProtectedMethod() { super.aProtectedMethod(); } 

в моем детском классе все нормально ...

Интересно, почему это так?

Ответы [ 4 ]

1 голос
/ 11 июня 2010

Я думаю, что вы столкнулись с этой ошибкой: http://code.google.com/p/google-web-toolkit/issues/detail?id=3646.

0 голосов
/ 11 июня 2010

Я не уверен, что понимаю ваш вопрос.Этот код выполняется просто отлично:

interface SomeInterface {
    public void interfaceMethod();
}

class Parent {
    private void doSomething() { System.out.println("hello world"); }
    protected void aProtectedMethod() { doSomething(); }
} 

class Child extends Parent {

    public static void main(String... args) {
        new Child().anotherMethod();
    }

    void anotherMethod() {
      new SomeInterface() {
          public void interfaceMethod() {
              aProtectedMethod();          // line A
          }
      }.interfaceMethod();
    }
}

(печатает hello world, как и ожидалось.)

Однако вас может смущать то, что в строке A (см. Код выше), *Ссылка 1007 * фактически ссылается на экземпляр объекта типа SomeInterface, а не на Child, что может объяснить, почему у вас возникают проблемы с вызовом aProtectedMethod.Вы можете получить доступ к ссылкам на Child s, написав Child.this.


Из документации по IllegalAccessException:

При попытке приложения выдается исключение IllegalAccessExceptionдля рефлексивного создания экземпляра (кроме массива), установки или получения поля или вызова метода, но исполняемый в настоящее время метод не имеет доступа к определению указанного класса, поля, метода или конструктора.

Используете ли вы API отражения?

0 голосов
/ 11 июня 2010

Я пытался, и это работало для меня на обычном Java (не скомпилировано GWT).

Это может быть ошибка (или функция) в компиляторе GWT.

Вы можете попытаться явно вызвать метод следующим образом:

Child.this.aProtectedMethod();
0 голосов
/ 11 июня 2010

Это в некотором смысле имеет смысл.Защищенный метод в Parent доступен для Parent и всего, что подклассы Parent.Внутренний класс имеет доступ ко всему в своем классе, который технически НЕТ защищенного метода в Parent.Так что, пока вы не добавите защищенный метод в Child, тогда просто вызовете метод Parent.

(Хм, на самом деле я не уверен, что мое объяснение яснее исходного кода. Извините. :))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...