Закрытый внутренний класс синтезирует неожиданный анонимный класс

Когда вы компилируете класс 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 ответ

Решение

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

Посмотрите на этот вопрос для деталей.

Другие вопросы по тегам