2015-07-03 37 views
0

我想在我的应用程序中动态生成类,并遇到了这个限制/错误?与javassist。javassist:无法用参数化地图/列表解析方法主体

似乎javassist无法解析source-body,如果它具有带参数化类型的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); 


    } 

这将使误差

异常在线程 “主要” javassist.CannotCompileException:源 错误];在 javassist.CtNewMethod.make(CtNewMethod.java:78)丢失在 javassist.CtNewMethod.make(CtNewMethod.java:44)

,但是当我改变身体

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

它工作正常。同样适用于“列表”。

任何提示?这是一个限制还是一个错误?

+0

似乎javassist只支持Java 1.4语法。 –

回答

1

正如你可以的了Javassist的局限性section 4.7 from Javassist tutorial一个读不支持在J2SE 5.0(包括枚举和泛型)引入新的语法。为了将来的参考,在同一时间,javassist在版本3.20中,这些信息可能在未来版本中发生变化。

只有当您使用高级API编写代码时,如果您使用低级API(直接编写字节码),则可以使用SignatureAttribute使用泛型。欲了解更多信息,请检查我给出的答案Javassist: creating an interface that extends another interface with generics