2009-08-12 24 views
5

Podczas kompilowania klasy Java z prywatną klasą wewnętrzną wydaje się, że anonimowa klasa jest automatycznie syntetyzowana wraz z nią z jakiegoś powodu. Podklasa ta nie jest wystarczająca, aby go odtworzyć:Prywatna klasa wewnętrzna syntezuje nieoczekiwaną anonimową klasę

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

    private static class InnerClass {} 
} 

Kiedy skompilowany ta generuje oczekiwanych SynthesizeAnonymous.class i SynthesizeAnonymous$InnerClass.class pliki, ale także generuje dziwne SynthesizeAnonymous$1.class plik odpowiadający anonimowego podklasy java.lang.Object który został syntetyzowany. Jeśli spojrzysz na demontaż za pomocą javap, domyślny konstruktor z InnerClass uzyska ukryty parametr tego anonimowego typu, a null zostanie mu przekazany po wywołaniu new InnerClass().

Dlaczego ta klasa jest utworzona? Został utworzony, nawet jeśli InnerClass nie jest statyczny, ale nie jest tworzony, jeśli InnerClass nie jest prywatny lub nie zostanie utworzone żadne wystąpienie InnerClass. Czy jest to jakaś forma kontroli dostępu? Jak to działa?

Odpowiedz

5

Ta klasa jest tworzona w celu zapewnienia dostępu do prywatnego konstruktora.

Aby uzyskać szczegółowe informacje, patrz: this question.

Powiązane problemy