我在Java中有一个WebApplication,它有3个线程,只是将一些数据发送到调用应用程序的程序,并将数据(log4j中的日志文件)保存到h2数据库。
现在我不希望有3个或多或少相同的线程。所以我试着用javassist和代理注入代码经过一些尝试我想我会得到我想要的结果!所以,如果我的代码是正确的(我稍后会发布它会很好看,如果你可以看一下)一些字节码将被插入到我的3线程方法之前它们被调用但是....
我使用了本教程 http://appcrawler.com/wordpress/2013/01/02/simple-byte-code-injection-example-with-javassist/
如果我想调用我的应用程序,我需要写 java -javaagent:myAgent.jar foo 所以说教程,但我的webApplication被其他java程序调用,我现在可以调用它,我的代理插入字节码会工作吗?可能不是,我想。所以,如果你能告诉我如何做到这一点,或者如何推进我的代码以便我不需要它,那就太好了。
代码: 我的Transform类(插入字节码)
public class MyTransformer implements ClassFileTransformer {
@Override
public byte[] transform(ClassLoader loader, String className, Class redefiningClass, ProtectionDomain protectionDomain, byte[] bytes) throws IllegalClassFormatException {
return transformClass(redefiningClass, bytes);
}
private byte[] transformClass(Class classToTransform, byte[] b) {
ClassPool pool = ClassPool.getDefault();
CtClass cl = null;
try {
cl = pool.get("de.test.ws.MyApplication");
} catch (javassist.NotFoundException e) {
e.printStackTrace();
}
try {
assert cl != null;
CtMethod[] methods = cl.getMethods();
for (int i = 0; i < methods.length; i++) {
if (methods[i].isEmpty() == false) {
changeMethod(methods[i]);
}
}
b = cl.toBytecode();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cl != null) {
cl.detach();
}
}
return b;
}
private void changeMethod(CtMethod method) throws NotFoundException, CannotCompileException {
if (method.hasAnnotation(Loggable.class)) {
method.insertBefore(" Thread thread0 = new Thread(new Runnable() {\n" +
"\n" +
" @Override\n" +
" public void run() {\n" +
"\n" +
"\n" +
" try {\n" +
" threadLogger.logCall(Webservice.class.getMethod(\"startThread0\"),\"Thread0\");\n" +
" } catch (Exception e) {\n" +
" e.printStackTrace();\n" +
" }\n" +
" }\n" +
" });\n" +
" thread0.start();");
}
}
}