2009-08-12 82 views
5

當您使用私有內部類編譯Java類時,由於某種原因,似乎會自動合成一個匿名類。這個類是足以重現:私有內部類合成意外的匿名類

public class SynthesizeAnonymous { 
    public static void method() { 
     new InnerClass(); 
    } 

    private static class InnerClass {} 
} 

在編譯時,這會產生預期的SynthesizeAnonymous.classSynthesizeAnonymous$InnerClass.class文件,但它也產生一個奇怪的SynthesizeAnonymous$1.class文件對應於該合成的java.lang.Object一個匿名子類。如果你看看javap的反彙編,看起來InnerClass的默認構造函數獲得了這個匿名類型的隱藏參數,並且在調用new InnerClass()時將null傳遞給它。

爲什麼創建這個類?即使InnerClass不是靜態的,也會創建它,但如果InnerClass不是私有的或者沒有創建InnerClass的實例,則不會創建它。是否有某種形式的訪問控制?這是如何運作的?

回答

5

創建此類是爲了讓您可以訪問私有構造函數。

有關詳細信息,請參閱this question