有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java javassist:无法使用参数化映射/列表分析方法体

我试图在我的应用程序中动态生成类,但遇到了这个限制/错误?使用javassist

如果源代码体具有参数化类型的映射/列表,则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; }

它很好用。这同样适用于“名单”

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


共 (1) 个答案

  1. # 1 楼答案

    正如您在section 4.7 from Javassist tutorial中所读到的,Javassist的一个限制是不支持在J2SE5.0(包括枚举和泛型)中引入的新语法。作为将来的参考,在并发的时候,javassist在3.20版本中,这些信息可能会在将来的版本中更改

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