我正在尝试在我的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
答案 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)
我现在编写了一个方法,只是使用字节码操作来编写方法...是最简单的分辨率。