Несколько дополнений к предыдущему ответу:
Используется ли атрибут InnerClasses для хранения содержащихся внутренних / вложенных классов в содержащем классе, или он используется во внутренних / вложенных классах для ссылки на класс «container»?
Байт-код каждого скомпилированного класса хранится в отдельном файле .class. Фактические «внутренние классы» не хранятся в этом атрибуте. Как указывалось в предыдущем посте, этот атрибут указывает только на классы, о которых знал компилятор при создании байт-кода.
Достаточно ли атрибута InnerClasses в файлах классов? Например. Должны ли внутренние / вложенные классы следовать за изменением имени с помощью $ или это просто соглашение?
Есть ли способ сделать класс похожим на внутренний / вложенный класс для JVM без установки атрибута InnerClasses, и зависит ли это от поставщика JLM? (Я помню, что слышал, что у реализации IBM в некоторых частях были менее строгие требования.)
По обоим вопросам я не уверен. Но я думаю, что концепция внутренних / вложенных классов - это то, что язык Java (и, следовательно, обеспечивает компилятор Java). В байт-коде не должно быть никакой разницы между классом, который был объявлен как обычный открытый класс, и некоторым вложенным или внутренним классом.
Вы можете легко проверить, как данная виртуальная машина справляется с этим следующим образом:
- Создать класс с несколькими вложенными и внутренними классами
- Напишите небольшую программу, которая пытается загрузить и создать один из внутренних классов посредством отражения вне области определения класса. Вы должны использовать отражение здесь, потому что компилятор Java не позволит вам создать экземпляр вложенного класса, который находится вне области видимости! Если вы можете успешно создать экземпляр класса, это свидетельствует о том, что внутренне виртуальная машина не обрабатывает вложенные и обычные классы по-разному.
Насколько механизм загрузки классов JVM взаимодействует с отражением Java? Можно ли заставить JVM не соглашаться с результатами рефлексии Java?
Я не понимаю этот последний вопрос. Не могли бы вы объяснить немного больше, что вы имеете в виду, когда говорите, что виртуальная машина и рефлексия не согласны?