我正在尝试在应用程序中动态生成类,但遇到了此限制/错误?使用javassist。
如果 javassist 具有带有参数化类型的 Maps/List,则似乎 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; }
效果很好。同样适用于“列表”。
有什么建议吗?这是限制还是错误?
最佳答案
正如您可以在 section 4.7 from Javassist tutorial 中读到的那样Javassist 的局限性之一是不支持 J2SE 5.0 中引入的新语法(包括枚举和泛型)。为了供将来引用,同时,javassist 版本为 3.20,此信息可能会在未来版本中更改。
此限制仅在您使用高级 API 编写代码时有效,如果您使用低级 API(直接编写字节码的 API),则可以使用SignatureAttribute 来使用泛型。 。有关更多信息,请查看我在 Javassist: creating an interface that extends another interface with generics 中给出的答案
关于javassist : cannot parse method body with parameterized Maps/Lists,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31200053/