2009-08-12 3 views
5

Когда вы компилируете Java-класс с частным внутренним классом, по какой-то причине кажется, что анонимный класс автоматически синтезируется вместе с ним. Этот класс достаточно, чтобы воспроизвести его:Частный внутренний класс синтезирует неожиданный анонимный класс

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

    private static class InnerClass {} 
} 

При компиляции, это генерирует ожидаемые SynthesizeAnonymous.class и SynthesizeAnonymous$InnerClass.class файлов, но она также создает странный SynthesizeAnonymous$1.class файл, соответствующий анонимный подкласс java.lang.Object, который был синтезирован. Если вы посмотрите на разборку с javap, появляется конструктор по умолчанию InnerClass, который получает скрытый параметр этого анонимного типа и передает ему null, когда вызывается new InnerClass().

Почему этот класс создан? Он создается, даже если InnerClass не является статическим, но он не создается, если InnerClass не является приватным или ни один экземпляр InnerClass не создан. Это какая-то форма контроля доступа? Как это работает?

ответ

5

Этот класс создан, чтобы предоставить вам доступ к частному конструктору.

Для получения более подробной информации см. this question.

Смежные вопросы