javassist.CannotCompileException:[source error])缺少什么?

时间:2015-07-27 09:52:04

标签: java javassist

我正在尝试在我的Web应用程序中编写一些字节码操作,当我尝试将我的代码注入我的方法时它总是会把错误抛给我

  

javassist.CannotCompileException:[source error])缺失

我不知道为什么以及这是什么......我用谷歌搜索过一些人说这是版本1.0 javassist的错误,但我认为这真的不切实际。

  private void changeMethod(CtMethod method) throws NotFoundException, 
CannotCompileException {
    if (method.hasAnnotation(Loggable.class)) {

    method.getName();


        method.insertBefore("long startTime = 0;" +
                "long startTime = System.currentTimeMillis();" +
                " Thread thread1 = new Thread(new Runnable(){\n" +
                "            @Override\n" +
                "            public void run() {\n" +
                "                threadLogger.info(\"Testlog\");\n" +
                "\n" +
                "                try {\n" +
                "                    threadLogger.logCall(Webservice.this.getClass().getMethod(startThread0), \"Thread\");\n" +
                "                   \n" +
                "                } catch (Exception e) {\n" +
                "                    e.printStackTrace();\n" +
                "                }\n" +
                "\n" +
                "            }\n" +
                "        });\n" +
                "        thread1.start();");

    }
}
enter code here

3 个答案:

答案 0 :(得分:2)

正如您在Javassist文档中所读到的那样,section 4.7 Limitations(粗体是我的):

  

不支持内部类或匿名类。请注意这一点   仅限编译器。它无法编译源代码   包括匿名类声明。 Javassist可以阅读和   修改内部/匿名类的类文件。

您正在尝试注入一个匿名的Runnable类,因此它无法正常工作。解决此问题的最佳方法是将Runnable类代码提取到注入和运行时在类路径中可用的新类,并在注入代码中使用该类。

答案 1 :(得分:0)

指字符串内的源代码中的编译错误。我能发现的第一个问题是你有

long startTime = 0;
long startTime = System.currentTimeMillis();

您正在定义变量两次,这将无法编译。

总的来说,我发现编写Javassist代码的最简单方法是从IDE类中复制它。这将帮助您发现大多数问题,并可以节省您在字符串中调试代码的时间。当然它并不完美,因为大多数时候代码都不能在IDE中编译,因为它引用的东西只能在代码插入点中起作用,但它会发现像double变量等问题。

答案 2 :(得分:0)

我现在编写了一个方法,只是使用字节码操作来编写方法...是最简单的分辨率。