Различные источники предлагают различные способы реализации ClassFileTransformer
с Javassist:ClassFileTransformer реализации с Javassist
blog.newrelic.com/2014/09/29/diving-bytecode-manipulation-creating-audit-log-asm-javassist/
public byte[] transform(...) {
ClassPool pool = ClassPool.getDefault(); // Edited to simplify
pool.insertClassPath(new ByteArrayClassPath(className, classfileBuffer));
CtClass cclass = pool.get(className.replaceAll("/", "."));
...
return cclass.toBytecode();
}
blog.javabenchmark.org/2013/05/java-instrumentation-tutorial.html
public byte[] transform(...) {
ClassPool cp = ClassPool.getDefault();
CtClass cc = cp.get("org.javabenchmark.instrumentation.Sleeping");
...
return cc.to:byteCode(); // edited to simplify
}
http://javapapers.com/core-java/java-instrumentation/
public byte[] transform(...) {
ClassPool classPool = ClassPool.getDefault();
CtClass ctClass = classPool.makeClass(new ByteArrayInputStream(classfileBuffer));
...
return ctClass.to:byteCode(); // edited to simplify
}
Какой самый правильный путь и почему? Есть ли другие решения, которые лучше, чем эти три?
https://stackoverflow.com/a/26725215/776884 упоминает настройки правильного загрузчика классов. Требуется ли при использовании инструментария API? Должен ли использоваться ClassPool classPool = new ClassPool()
с CtClass.makeClass()
с инсталляционным API?
Спасибо. Мне пришлось попробовать использовать ClassPool classPool = new ClassPool(); 'прежде чем я полностью понял, что classpool для генерации кода. Получение ошибок об отсутствующем классе класса помогло понять это. – jikuja