Java JDK11基於巢狀的訪問控制

qianmoQ發表於2019-01-19

Java(和其他語言)通過內部類支援巢狀類。要使其正常工作,需要編譯器執行一些技巧。這是一個例子:

public class Outer {
    private int outerInt;

     class Inner {
       public void printOuterInt() {
         System.out.println("Outer int = " + outerInt);
       }
    }
}

在執行編譯之前,編譯器會修改它以建立類似的東西:

public class Outer {
  private int outerInt;

  public int access$000() {
    return outerInt; 
  }

}

class Inner$Outer {

  Outer outer;

  public void printOuterInt() {
    System.out.println("Outer int = " + outer.access$000());
  }
}

雖然從邏輯上講,內部類是與外部類相同的程式碼實體的一部分,但它被編譯為一個單獨的類。因此,它需要編譯器建立合成橋接方法,以提供對外部類的私有欄位的訪問。

這個JEP引入了巢的概念,其中同一巢的兩個成員(我們的例子中的外部和內部)是同窩。為類檔案格式NestHost和NestMembers定義了兩個新屬性。這些更改對於支援巢狀類並編譯為位元組碼的其他語言非常有用。

此功能為java.lang.Class引入了三個新方法:

  • Class getNestHost()
  • Class[] getNestMembers()
  • boolean isNestmateOf(Class)

此功能還需要更改Java虛擬機器規範(JVMS),特別是第5.4.4節“訪問控制”。

相關文章