Вы правильно заметили, что термин «обычно», а также отсутствие какого-либо описания байт-кода в JLS предназначены для того, чтобы определить язык программирования Java как можно более независимым от среды выполнения. Тем не менее, это не так просто:
Как отмечалось выше, эта спецификация часто относится к классам API платформы Java SE. В частности, некоторые классы имеют особые отношения с языком программирования Java. Примеры включают такие классы, как Object
, Class
, ClassLoader
, String
, Thread
, а также классы и интерфейсы в пакете java.lang.reflect
, среди прочих. Эта спецификация ограничивает поведение таких классов и интерфейсов, но не дает для них полную спецификацию. Читатель отсылается к документации по API платформы Java SE.
Следовательно, эта спецификация не описывает отражение в деталях. Многие лингвистические конструкции имеют аналоги в Core Reflection API (java.lang.reflect
) и Language Model API (javax.lang.model
), но обычно они здесь не обсуждаются. Например, когда мы перечисляем способы создания объекта, мы обычно не включаем способы, которыми Core Reflection API может это сделать. Читатели должны знать об этих дополнительных механизмах, даже если они не упоминаются в тексте.
Таким образом, язык программирования Java — это больше, чем JLS, это также API платформы Java SE. И там у нас есть defineClass
методов упомянутого ClassLoader
класса, принимающих входные данные в формате файла класса. Таким образом, даже если мы используем другие средства развертывания, кроме файлов классов в формате байт-кода, полностью совместимая среда должна поддерживать этот формат в данном месте. Обратите внимание, что в Java 9 появились еще один метод, принимающий ввод в формате файла класса, который даже не требует отражения или реализации пользовательских загрузчиков классов.
Это исключает JavaME, в котором нет этих артефактов API, упомянутых в JLS, в противном случае у нас уже был пример среды Java, не поддерживающей манипулирование байт-кодом.
Но это все еще не дает полного ответа на вопрос, является ли манипулирование байт-кодом неязыковым, говоря о JavaSE или EE. Даже если поддержка формата байт-кода обеспечивается стандартным API, манипулирование байт-кодом зависит от деталей реализации, будь то инструментальный API, чья поддержка не является обязательной, или обработка скомпилированных файлов классов в их развернутой форме, в виде файловой иерархии, файлов jar или модуля. файлы, ни один из которых не гарантируется развернутой формой приложения (как было сказано в начале). Таким образом, действительно невозможно реализовать инструмент для работы с байт-кодом, который гарантированно работает с каждой возможной средой Java, хотя вам придется приложить немало усилий, чтобы создать среду, которая полностью совместим, но не работает с этими инструментами…
person
Holger
schedule
29.11.2017