从内部类从父级访问受保护的方法时获取IllegalAccessException

时间:2010-06-11 18:12:24

标签: java gwt

我遇到了一个非常奇怪的问题和一个奇怪的解决方案:

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

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

当运行child.anotherMethod()时,我在myProtectedMethod()处得到了IllegalAccessException,说我的内部类没有访问Parent类的权限......

但是,如果我添加:

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

在我的Child课程中,一切都很好......

我想知道为什么会这样?

4 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

在某种程度上,这是有道理的。 Parent中可以访问Parent中的受保护方法,以及Parent子类的任何内容。内部类可以访问其包含类中的任何内容,而Parent中的受保护方法在技术上不是。所以,直到你向Child添加一个受保护的方法,然后才调用Parent的方法。

(嗯,我真的不确定我的解释是否比原始代码更清晰。抱歉。:))

答案 2 :(得分:0)

我不确定我理解你的问题。这段代码执行得很好:

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行(参见上面的代码),this引用实际上是指类型为SomeInterface的对象的实例,而不是{{1}这可以解释为什么你在调用Child时遇到问题。您可以通过编写aProtectedMethod来访问Child的引用。


关于IllegalAccessException的文档:

  

当应用程序尝试反射创建实例(数组除外),设置或获取字段或调用方法时,抛出IllegalAccessException,但当前正在执行的方法无法访问指定类的定义,字段,方法或构造函数。

您使用的是反射API吗?

答案 3 :(得分:0)

我试过了,它在普通的java(不是GWT编译)中为我工作。

它可能是GWT编译器中的错误(或功能)。

您可以尝试显式调用此方法:

Child.this.aProtectedMethod();