2015-07-03 7 views
0

Я пытаюсь динамически генерировать классы в своем приложении и сталкивался с этим ограничением/ошибкой? с джавассистом.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); 


    } 

Это даст ошибку

Исключение в потоке "главный" javassist.CannotCompileException: [источник ошибка]; отсутствует в javassist.CtNewMethod.make (CtNewMethod.java:78) в javassist.CtNewMethod.make (CtNewMethod.java:44)

, но когда я изменить тело

public void test() { java.util.Map tmp=null; } 

Он работает нормально. То же самое относится к «списку».

Любые советы? Это ограничение или ошибка?

+0

Кажется, javassist поддерживает только синтаксис Java 1.4. –

ответ

1

Как вы можете прочитать в section 4.7 from Javassist tutorial одного из ограничений в Javassist является не поддерживает новый синтаксис введенный в J2SE 5.0 (включая перечисления и дженерик). В будущем, в параллельное время, javassist находится в версии 3.20, эта информация может измениться в будущих выпусках.

Это ограничение применяется только при использовании API высокого уровня для написания кода, если вы используете API низкого уровня (тот, который вы пишете байт-код напрямую), вы можете использовать дженерики, используя SignatureAttribute. Для получения дополнительной информации об этом, пожалуйста, проверьте ответ, который я дал в Javassist: creating an interface that extends another interface with generics.