Получить 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) запустить преобразователь файла класса выше, который будет содержать файл класса сгенерированного типа, даже если он недоступен из загрузчика классов.

Другие вопросы по тегам