Получить InputStream класса, который создается динамически (используя байт-код)?
Я создаю класс динамически - создавая байт-код и загружая его с помощью загрузчика классов. Позже мне нужно получить InputStream
этого класса. С общим классом я получаю это, получая ресурс URL
для этого класса, а затем открыть поток (url.openStream()
). Очевидно, что здесь я не могу этого сделать, так как динамически загружаемый класс не имеет URL-адреса.
Как я могу получить InputStream
динамически создаваемого класса?
Единственное решение, которое я могу придумать, - сохранить байт-коды во временном файле / памяти, а затем предоставить InputStream
от него.
РЕДАКТИРОВАТЬ
я нуждаюсь InputStream
сделать еще одно изменение байт-кода поверх существующего.
1 ответ
Если загрузчик класса не предоставляет байт-код класса через getResource
или же getResourceAsStream
(это законно, в контракте загрузчика классов такая вещь не указана), вы все равно можете использовать Java-агент для запроса виртуальной машины о создании для вас байтового кода.
Например, вы можете зарегистрировать следующий преобразователь:
instrumentation.addTransformer(new ClassFileTransformer() {
@Override
public byte[] transform(ClassLoader loader,
String name,
Class<?> classBeingRedefined,
ProtectionDomain pd,
byte[] classFileBuffer) {
doSomethingWith(classFileBuffer);
return null;
}
}, true);
После подключения агента Java вы можете позвонить: instrumentation.retransform(someGeneratedClass)
запустить преобразователь файла класса выше, который будет содержать файл класса сгенерированного типа, даже если он недоступен из загрузчика классов.