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 楼答案
正如您在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中给出的答案