javassist:无法解析带有参数化 Maps/Lists 的方法体

javassist : cannot parse method body with parameterized Maps/Lists

我试图在我的应用程序中动态生成 类 并遇到这个 limitation/bug?与 javassist.

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

例如:

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; }

它工作正常。同样适用于 "List" .

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

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

这个限制只有当你使用高级API写代码时,如果你使用低级API(你直接写字节码)你可以使用泛型使用SignatureAttribute. For more information on that please check the answer I gave in