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