使用Javassist
我正在尝试将一行代码插入方法的主体。这是对intellij-IDE
. 尝试这样做时出现以下错误:
原因:java.lang.LinkageError: loader com.intellij.util.lang.UrlClassLoader @d2cc05a 尝试为 com.intellij.ui.components.labels.LinkLabel 重复类定义。(com.intellij.ui.components.labels.LinkLabel 位于加载器 com.intellij.util.lang.UrlClassLoader @d2cc05a 的未命名模块中,父加载器“平台”)
这意味着我试图修改的类已经被 Java 类加载器加载了(至少我喜欢这样想..)。代码示例如下:
private static void test() {
try {
ClassPool cp = ClassPool.getDefault();
CtClass cc = cp.get("com.intellij.ui.components.labels.LinkLabel");
CtMethod cm = cc.getDeclaredMethod("getTextColor");
cm.insertBefore("System.out.println(\"helloworld\");");
cc.toClass(); // <--- the problem
} catch (final Throwable e) {
e.printStackTrace();
}
}
作为参考,这里是访问的类:intellij 链接
几年前,Rafael Winterhalter评论了一个类似的问题(链接)。不幸的是,我的知识Javassist
限制了我找到合适的解决方案。
关于如何解决这个问题的任何想法?
更新:可以在这里找到一个最小的、可重复的示例:github 链接