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
我试图在我的应用程序中动态生成 类 并遇到这个 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