Как включить байт-код в спящий режим без Spring - PullRequest
1 голос
/ 26 февраля 2020

У меня обычный java проект, использующий Hibernate / JPA. Нет весны. Нет J2EE. И я хочу включить улучшение байт-кода во время выполнения. Пользовательский загрузчик классов уже находится внутри проекта, поэтому я думаю, что я мог бы использовать org.hibernate.bytecode.spi.InstrumentedClassLoader.InstrumentedClassLoader (ClassLoader, ClassTransformer). Но как получить нужный ClassTransformer? Или я не на том пути?

1 Ответ

0 голосов
/ 27 февраля 2020

работает, если ClassFileTransformerAdapter добавлен в качестве преобразователя в premain javaagent. (см. http://appcrawler.com/wordpress/2013/01/02/simple-byte-code-injection-example-with-javassist/)

нуждается в "-javaagent: Enhancer.jar" в качестве аргумента Vm

public class EnhancerMain {
  public static void premain(String agentArguments, Instrumentation instrumentation) {
    System.out.println("install enhancer");
    instrumentation.addTransformer(new ClassFileTransformerAdapter(new EnhancingClassTransformerImpl(new DefaultEnhancementContext())));
  }
}

public class ClassFileTransformerAdapter implements ClassFileTransformer {

  private final ClassTransformer classTransformer;

  public ClassFileTransformerAdapter(ClassTransformer classTransformer) {
    Objects.requireNonNull(classTransformer);
    this.classTransformer = classTransformer;
  }

  public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) {
    if (className.startsWith("java/")) {
      return null;
    }
    if (className.startsWith("sun/")) {
      return null;
    }
    if (className.startsWith("com/sun/")) {
      return null;
    }
    if (className.startsWith("javax/")) {
      return null;
    }
    try {
      byte[] transformed = this.classTransformer.transform(loader, className, classBeingRedefined, protectionDomain, classfileBuffer);
      return transformed;
    } catch (IllegalClassFormatException e) {
      throw new IllegalStateException("Error enhancing class: " + className, e);
    }
  }
}
Manifest-Version: 1.0
Premain-Class: com.enhancer.EnhancerMain

...