Когда вы компилируете 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
не создан. Это какая-то форма контроля доступа? Как это работает?