Java 如何在没有Spring的情况下启用hibernate字节码增强
我有一个使用Hibernate/JPA的普通java项目。没有春天。没有J2EE。我想启用运行时字节码增强。Java 如何在没有Spring的情况下启用hibernate字节码增强,java,hibernate,jpa,Java,Hibernate,Jpa,我有一个使用Hibernate/JPA的普通java项目。没有春天。没有J2EE。我想启用运行时字节码增强。 项目中已经有一个自定义类加载器,所以我想我可以使用org.hibernate.bytecode.spi.InstrumentedClassLoader.InstrumentedClassLoader(ClassLoader,ClassTransformer)。但是如何获得所需的ClassTransformer呢?还是我走错了方向?如果在javaagent的premain中添加一个Clas
项目中已经有一个自定义类加载器,所以我想我可以使用org.hibernate.bytecode.spi.InstrumentedClassLoader.InstrumentedClassLoader(ClassLoader,ClassTransformer)。但是如何获得所需的ClassTransformer呢?还是我走错了方向?如果在javaagent的premain中添加一个ClassFileTransformerAdapter作为transformer,那么它就会工作。 (见附件) 需要“-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);
}
}
}
您试图解决的最初问题是什么?延迟加载oneToOne关系和使用自动收集管理可能是您的意思?没错。已编辑。您应该使用maven或gradle插件,如上面链接的文档所述。
Manifest-Version: 1.0
Premain-Class: com.enhancer.EnhancerMain