[英]Howto enable hibernate bytecode enhancement WITHOUT Spring
我有一個使用 Hibernate/JPA 的普通 Java 項目。 沒有春天。 沒有 J2EE。 我想啟用運行時字節碼增強。 自定義類加載器已經在項目中,所以我想我可以使用 org.hibernate.bytecode.spi.InstrumentedClassLoader.InstrumentedClassLoader(ClassLoader, ClassTransformer)。 但是如何獲得所需的 ClassTransformer 呢? 還是我走錯了路?
如果將 ClassFileTransformerAdapter 添加為 javaagent 的 premain 中的轉換器,則工作正常。 (見http://appcrawler.com/wordpress/2013/01/02/simple-byte-code-injection-example-with-javassist/ )
需要“-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.