javassist : cannot parse method body with parameterized Maps/Lists

标签 java java-bytecode-asm javassist bytecode-manipulation

我正在尝试在应用程序中动态生成类,但遇到了此限制/错误?使用javassist。

如果 javassist 具有带有参数化类型的 Maps/List,则似乎 javassist 无法解析源体。

例如:

public static void main( String[] args ) throws Exception
    {
        ClassPool pool = ClassPool.getDefault();

        CtClass evalClass = pool.makeClass("Eval");

        evalClass.addMethod(
            CtNewMethod.make("public void test () { java.util.Map<java.lang.String, java.lang.String> tmp=null; }", evalClass));


        Class clazz = evalClass.toClass();
        Object obj = clazz.newInstance();

        Class[] formalParams = new Class[] { };
        Method meth = clazz.getDeclaredMethod("test", formalParams);
        Object[] actualParams = new Object[] {  };
         meth.invoke(obj, actualParams);


    }

这将给出错误

Exception in thread "main" javassist.CannotCompileException: [source error] ; is missing at javassist.CtNewMethod.make(CtNewMethod.java:78) at javassist.CtNewMethod.make(CtNewMethod.java:44)

但是当我将正文更改为

public void test () { java.util.Map tmp=null; }

效果很好。同样适用于“列表”。

有什么建议吗?这是限制还是错误?

最佳答案

正如您可以在 section 4.7 from Javassist tutorial 中读到的那样Javassist 的局限性之一是不支持 J2SE 5.0 中引入的新语法(包括枚举和泛型)。为了供将来引用,同时,javassist 版本为 3.20,此信息可能会在未来版本中更改。

此限制仅在您使用高级 API 编写代码时有效,如果您使用低级 API(直接编写字节码的 API),则可以使用SignatureAttribute 来使用泛型。 。有关更多信息,请查看我在 Javassist: creating an interface that extends another interface with generics 中给出的答案

关于javassist : cannot parse method body with parameterized Maps/Lists,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31200053/

相关文章:

Java:在运行时从同一 JVM 中获取类的字节码

java - 我们可以使用 javassist 向现有类添加非原始字段吗?

Javassist 和命名内部类

java - 调整上传图片的大小以便更好地查看

java - 如何查看 http-response-code 406 异常的消息

java - 当一个长进程正在运行时,如何在我的 JFrame 中加载动画 GIF?

java - 函数返回接口(interface)是什么意思?

java - asm如何生成子类

java - Java中如何找到方法调用的行号

java - 使用 javassist 通过字节码中的方法替换 java 运算符