大家好,我一直在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)
我得到了它的工作。对于有同样的问题的解决方案是,在我的情况下,包装方法属于例外的可变参数的参数,而我经过串,适当的参数正确调用该方法的人,一旦我发现了如何调用可变参数的方法通过Javassist进行论证我得到的代码工作。下面是其中的伎俩我线程https://issues.jboss.org/browse/JASSIST-192?_sscc=t