Динамическое создание Java-класса с помощью байт-кода одного метода - PullRequest
1 голос
/ 20 мая 2019

Я понимаю, что если у меня есть файл класса, я могу загрузить его во время выполнения и выполнить его методы через classLoader.Тем не менее, что, если у меня есть только байт-код или Java-код для одного метода?Можно ли динамически создать класс во время выполнения, а затем вызвать метод?

Ответы [ 2 ]

2 голосов
/ 20 мая 2019

Существует плановая функция, JEP 8158765: изолированные методы , а также в списке отслеживания ошибок , которая позволит загружать и выполнять такой байт-код без генерации полностью материализованного Class. Это может выглядеть как

MethodHandle loadCode(String name, MethodType type, byte[] instructions, Object[] constants)

в классе MethodHandles.Lookup

Однако эта функция находится в состоянии draft , поэтому может потребоваться значительное время, прежде чем она станет действительным API, и даже может случиться так, что ее отбросят в пользу совершенно другой функции, охватывающей случаи использования Авторы JEP имеют в виду.

До тех пор невозможно создать необходимые байты до и после байт-кода метода, чтобы описать полный класс и загрузить этот класс. Но, конечно, вы можете написать свой собственный метод, принимающий байт-код метода и некоторые метаданные, например ожидаемую сигнатуру, для создания такого класса и повторного использования этого метода.

Обратите внимание, что существует альтернатива созданию новых ClassLoader, Class<?> defineClass​(byte[] bytes) в классе MethodHandles.Lookup, который позволяет добавить класс в существующий контекст загрузки класса, начиная с Java 9.

1 голос
/ 20 мая 2019

Байт-код для метода ссылается на записи в пуле констант класса, поэтому он не имеет смысла в изоляции.

...