Как использовать атрибут InnerClass в файле класса? - PullRequest
0 голосов
/ 09 марта 2019

Я понимаю, что внутренние классы и анонимные классы являются конструкциями времени компиляции, предоставляемыми компилятором java.Если это так, почему классный файл должен содержать информацию о внутренних классах, объявленных внутри него.Спецификации JVM утверждают, что:

Атрибут InnerClasses должен быть распознан и правильно прочитан средством чтения файлов классов, чтобы правильно реализовать библиотеки классов платформы Java SE

IМне трудно понять, что означает это утверждение.Может кто-нибудь уточнить это утверждение?

Ответы [ 2 ]

2 голосов
/ 09 марта 2019

В байт-коде хранится много метаданных о функциях уровня Java, которые не оказывают прямого влияния на выполнение байт-кода. Это полезно по нескольким причинам. Во-первых, в Java есть библиотеки отражений, которые предоставляют доступ к этой информации, поэтому она должна быть доступна JVM во время выполнения. Во-вторых, он позволяет вам компилировать только двоичные библиотеки.

Другим примером «бесполезной» функции являются предложения throws (хранящиеся в качестве необязательного атрибута в байт-коде). Они необходимы, чтобы вы могли компилировать файлы классов без исходного кода, но не влияют на выполнение байт-кода.

1 голос
/ 09 марта 2019

Эта информация необходима из Java11 и связана с тем, как внутренние классы получают доступ к методам и переменным внешнего класса.

Подробнее об этом можно прочитать здесь: openjdk.java.net / jeps / 181

РЕДАКТИРОВАТЬ:

Давайте рассмотрим следующий пример:

public class Outer {

    public void print() {
        System.out.println("Hello");
    }

    private class Inner {

        public Inner() {
            print();
        }
    }
}

Если вы скомпилируете этот класс с java8 (слева) и java11 (справа), вы увидите следующие различия:

enter image description here enter image description here

...