Начиная с Java 11 можно загружать произвольные константы с помощью инструкции LDC
. Это могут быть объекты произвольного типа, но имеющие постоянную семантику, поэтому желательно, чтобы они были неизменяемыми.
Чтобы это работало, указанная запись пула констант должна быть CONSTANT_Dynamic_info
, который имеет структуру, аналогичную структуре CONSTANT_InvokeDynamic_info
, и также описывает метод начальной загрузки.
Одно отличие состоит в том, что запись name_and_type_index
динамической информационной структуры будет указывать на дескриптор поля. Кроме того, метод начальной загрузки имеет сигнатуру (MethodHandles.Lookup,String,Class[,static arguments])
с аргументом Class
, представляющим ожидаемый тип константы, а не объект MethodType
. Метод начальной загрузки должен напрямую возвращать постоянное значение, а не сайт вызова.
Общим для инструкции invokedynamic
является то, что результат первого процесса начальной загрузки будет связан с инструкцией LDC
и использоваться во всех последующих исполнениях (поскольку он должен быть константой).
Интересное свойство этих динамических констант состоит в том, что они являются действительными статическими аргументами метода начальной загрузки для другой динамической константы или инструкции invokedynamic
(пока между динамическими константами нет циклической зависимости).
Обратите внимание, что уже существует удобный класс, содержащий несколько готовых к использованию методов начальной загрузки для динамических констант.
person
Holger
schedule
09.11.2018