javassist:无法使用参数化的地图/列表解析方法体

时间:2015-07-03 06:32:20

标签: java java-bytecode-asm javassist bytecode-manipulation

我正在尝试在我的应用程序中动态生成类并遇到此限制/错误?与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;

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

1 个答案:

答案 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

中给出的答案