简体   繁体   English

如何在没有 Spring 的情况下启用休眠字节码增强

[英]Howto enable hibernate bytecode enhancement WITHOUT Spring

I have a plain java project using Hibernate / JPA.我有一个使用 Hibernate/JPA 的普通 Java 项目。 No Spring.没有春天。 No J2EE.没有 J2EE。 And i want to enable runtime bytecode enhancement.我想启用运行时字节码增强。 A custom class loader is already inside the project so i think i could use org.hibernate.bytecode.spi.InstrumentedClassLoader.InstrumentedClassLoader(ClassLoader, ClassTransformer).自定义类加载器已经在项目中,所以我想我可以使用 org.hibernate.bytecode.spi.InstrumentedClassLoader.InstrumentedClassLoader(ClassLoader, ClassTransformer)。 But how to get the needed ClassTransformer?但是如何获得所需的 ClassTransformer 呢? Or am i on the wrong track?还是我走错了路?

works if a ClassFileTransformerAdapter is added as transformer in the premain of a javaagent.如果将 ClassFileTransformerAdapter 添加为 javaagent 的 premain 中的转换器,则工作正常。 (see http://appcrawler.com/wordpress/2013/01/02/simple-byte-code-injection-example-with-javassist/ ) (见http://appcrawler.com/wordpress/2013/01/02/simple-byte-code-injection-example-with-javassist/

needs "-javaagent:enhancer.jar" as Vm Argument需要“-javaagent:enhancer.jar”作为虚拟机参数

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM