簡體   English   中英

IllegalAccessError:訪問受保護的方法

[英]IllegalAccessError: accessing a protected method

我有兩節課。

A已保護的方法m() a是實例A

B類與A類在同一個包裝中。

我試圖訪問am()但我得到IllegalAccessError ...

怎么了?

編譯器應該捕獲這樣的錯誤。 正如你在運行時顯然得到的那樣,發生了一些奇怪的事情。 您可能已更改源代碼但已完全重新編譯。

另一個潛在但又模糊的問題是通過不同的類加載器加載類。 即使包名稱相同,從不同類加載器加載的類也將位於不同的包中(與由不同類加載器加載的具有相同名稱的類相同的方式將是不同的類)。

如果類A和B由不同的類加載器加載,則會發生這種情況。 然后,jvm將這些類視為不同的“運行時包”。 引用jvm規范 ,第5.3節:

在運行時,類或接口不是由其名稱單獨確定,而是由一對確定:它的完全限定名稱及其定義的類加載器。 每個這樣的類或接口都屬於單個運行時包。 類或接口的運行時包由包名稱和類或接口的類加載器定義。

在5.4.4節中:

當且僅當滿足以下任一條件時,才能訪問類或接口D的字段或方法R.

...

R既可以是受保護的,也可以是包私有的(既不是公共的也不是受保護的,也不是私有的),並且由與D相同的運行時包中的類聲明。

它必須工作,請參閱以下示例,該工作正常:

package com.stackoverflow;

public class TEST
{
  static class A {
    protected void m()
    {
      System.out.println("hello from A.m()");
    }
  }

  static class B {

    public B()
    {
      a.m();
    }

    private A a = new A();
  }

  /**
   * @param args
   */
  public static void main(String[] args)
  {
    B b = new B();
  }
}

打印出預定的消息:“ hello from Am()

“protected修飾符指定只能在自己的包中訪問該成員(與package-private一樣),此外,還可以在另一個包中通過其類的子類訪問。”

請參閱控制對類成員的訪問

編譯器應該捕獲這樣的錯誤。 當你在運行時得到它時,發生了一些錯誤。 很可能你已經改變了完全重新編譯的源代碼。

它必須工作。 這是一個運行的例子 -

**

  • 一級A.

**

package com.test;

public class A {

  protected void m(){
  System.out.println("Hi Stackoverflow");
 }

}

**

  • CLASS B.

**

package com.test;

public class B{

public static void main(String[] args) {
  A a = new A();
  a.m();
 }

}

打印預期的字符串

您好Stackoverflow

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM