работает, если 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