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