我正在尝试在我的应用程序中动态生成类并遇到此限制/错误?与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);
}
这将给出错误
线程中的异常&#34; main&#34; javassist.CannotCompileException:[source 错误];失踪了 javassist.CtNewMethod.make(CtNewMethod.java:78)at javassist.CtNewMethod.make(CtNewMethod.java:44)
但是当我将身体改为
时public void test () { java.util.Map tmp=null; }
工作正常。同样适用于&#34; List&#34;
任何提示?这是限制还是错误?
答案 0 :(得分:1)
正如您在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
中给出的答案