javassist: невозможно проанализировать тело метода с параметризованными картами/списками

Я пытаюсь динамически генерировать классы в своем приложении и столкнулся с этим ограничением/ошибкой? с явасистом.

Кажется, javassist не может разобрать исходное тело, если оно имеет карты/список с параметризованными типами.

eg :

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; }

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

Какие-нибудь советы? Это ограничение или баг?


person Ashika Umanga Umagiliya    schedule 03.07.2015    source источник
comment
кажется, javassist поддерживает только синтаксис Java 1.4.   -  person Ashika Umanga Umagiliya    schedule 03.07.2015


Ответы (1)


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

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

person pabrantes    schedule 03.07.2015