javassist.CannotCompileException:[源代码错误])缺失这是什么?

javassist.CannotCompileException:[源代码错误])缺失这是什么?,java,javassist,Java,Javassist,我现在正试图在我的web应用程序中编写一些字节码操作,当我尝试将代码注入我的方法时,它总是抛出错误 缺少javassist.CannotCompileException:[源代码错误]) 我不知道为什么,这是什么。。。我在谷歌上搜索了一下,有人说这是1.0版javassist的一个bug,但我认为这是不现实的 private void changeMethod(CtMethod method) throws NotFoundException, CannotCompileException

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

缺少javassist.CannotCompileException:[源代码错误])

我不知道为什么,这是什么。。。我在谷歌上搜索了一下,有人说这是1.0版javassist的一个bug,但我认为这是不现实的

  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

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

long startTime = 0;
long startTime = System.currentTimeMillis();
您定义了两次变量,这将无法编译


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

正如您在Javassist文档中看到的那样,(粗体是我的):

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


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

我现在编写了一个方法,只需使用字节码操作注入该方法。。。是最简单的解决方案。

hmm这不是问题所在:没有字节码操作,代码可以工作。您可以打印字符串,粘贴到IDE中,然后查看它是否编译。不应该是因为你定义了两次同一个变量。Jeah我知道你的意思,我修正了代码,这样我就不会定义同一个变量两次,当我在IDE中运行代码时,它工作正常,你仍然会得到与以前相同的错误?是的,现在我尝试打印我的方法体,这样我就可以看到哪里出了问题:D,但我不知道怎么做那一刻谢谢你首先:D我需要一段时间才能把它编码好,因为我很糟糕,哈哈,但我很确定它会工作的:D