如何使用premain调用WebApp

时间:2015-07-22 14:53:14

标签: java bytecode instrumentation javassist bytecode-manipulation

我在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();");
        }
    }
}

0 个答案:

没有答案