Javassist не вызывает метод, определенный в суперклассе - PullRequest
0 голосов
/ 04 февраля 2019

Привет всем, я пробовал свои силы в библиотеке Javassist и, кажется, натолкнулся на препятствие, которое я не могу преодолеть.проблема в том, что я хочу динамически создать класс конфигурации, который расширяет класс ResourceConfig Джерси, а в конструкторе я хочу зарегистрировать пакеты и фабричный объект для внедрения.но каждый раз, когда я получаю сообщение об ошибке (опубликовано ниже)

public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        ClassPool pool = ClassPool.getDefault();

        CtClass superCc = null;
        try {
            superCc = pool.get(ResourceConfig.class.getCanonicalName());

        } catch (NotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        try {
            CtClass cc = pool.makeClass("org.demonking.AppConfig");
            cc.setSuperclass(superCc);
            System.out.println(cc.getSuperclass().getName());
            CtConstructor constructor = new CtConstructor(new CtClass[0], cc);

            constructor.setBody("{\n"+"packages(\"org.demonking\");"+"\n"+"register(InjectorDemo.class);"+"\n"+"}");


            cc.addConstructor(constructor);

        } catch (CannotCompileException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
//rest of my jersey code
}

оригинальный AppConfig (который отлично работает), я хочу создать динамически

public class AppConfig extends ResourceConfig{

    public AppConfig()
    {
        packages("org.demonking");
        register(new AbstractBinder(){
            @Override
            protected void configure() {
                bindFactory(ContextHelperFactory.class)
                        .to(ContextHelper.class)
                        .in(RequestScoped.class);
            } 
        });
    }

Примечание. В процессе исследования я обнаружил, что у javassist естьнекоторые ограничения, касающиеся анонимных внутренних классов, поэтому код был перемещен в класс InjectorDemo.

public class InjectorDemo extends AbstractBinder {

    @Override
    protected void configure() {
        // TODO Auto-generated method stub
             bindFactory(ContextHelperFactory.class)
                     .to(ContextHelper.class)
                     .in(RequestScoped.class);
    }
}

ошибка

javassist.CannotCompileException: [source error] packages(java.lang.String) not found in org.demonking.AppConfig
    at javassist.CtBehavior.setBody(CtBehavior.java:446)
    at javassist.CtBehavior.setBody(CtBehavior.java:412)
    at javassist.CtConstructor.setBody(CtConstructor.java:217)
    at org.logicunit.JavassistDemoMain.main(JavassistDemoMain.java:42)
Caused by: compile error: packages(java.lang.String) not found in org.demonking.AppConfig
    at javassist.compiler.TypeChecker.atMethodCallCore(TypeChecker.java:749)
    at javassist.compiler.TypeChecker.atCallExpr(TypeChecker.java:695)
    at javassist.compiler.JvstTypeChecker.atCallExpr(JvstTypeChecker.java:157)
    at javassist.compiler.ast.CallExpr.accept(CallExpr.java:46)
    at javassist.compiler.CodeGen.doTypeCheck(CodeGen.java:242)
    at javassist.compiler.CodeGen.atStmnt(CodeGen.java:330)
    at javassist.compiler.ast.Stmnt.accept(Stmnt.java:50)
    at javassist.compiler.CodeGen.atStmnt(CodeGen.java:351)
    at javassist.compiler.ast.Stmnt.accept(Stmnt.java:50)
    at javassist.compiler.CodeGen.atMethodBody(CodeGen.java:292)
    at javassist.compiler.Javac.compileBody(Javac.java:223)
    at javassist.CtBehavior.setBody(CtBehavior.java:438)

1 Ответ

0 голосов
/ 04 февраля 2019

Я получил его на работу. Для тех, у кого возникла та же проблема, решение состояло в том, чтобы правильно вызвать метод с правильными параметрами, в моем случае метод packages превысил аргумент varargs, когда я передавал строку, как только яузнал, как вызвать метод с аргументом varargs через javassist, я получил код для работы.Вот нить, которая сделала мне трюк https://issues.jboss.org/browse/JASSIST-192?_sscc=t

...