我正在尝试在我的开发环境中模拟一些服务。serviceFactory 代码类似于:
public class ApiFacadeImpl implements ApiFacade {
private OneService oneService = null;
public OneService getOneService(){
if(oneService==null) {//some initialization steps }
return oneService;
}
}
我知道这家工厂没有很好的编码和设计。但是我不能修改它的代码。我的想法是更改字节码,因此我可以将其重新定义为:
public class ApiFacadeImpl implements ApiFacade {
private OneService oneService = new MyMockOneService();
....
}
我的第一个问题是:这可能使用 javassist 吗?如何?
由于我找不到使用 google 使用 javassist 重新初始化字段之类的东西,我尝试自己删除并重新创建它:
CtField oneServiceField = cc.getDeclaredField("oneService");
cc.removeField(oneServiceField);
CtField f = CtField.make(String.format("private %s %s=new %s();",
oneServiceField.getType().getName(), "oneService",
mockClass.getCanonicalName()), cc);
cc.addField(f);
cc.toClass();
然后我得到了例外:
javassist.CannotCompileException: by java.lang.ClassFormatError: Invalid length 99 in LocalVariableTable in class file com/Test
at javassist.ClassPool.toClass(ClassPool.java:1051)
at javassist.ClassPool.toClass(ClassPool.java:994)
at javassist.ClassPool.toClass(ClassPool.java:952)
at javassist.CtClass.toClass(CtClass.java:1079)
我的第二个问题是为什么这个例外?哪一步违反了java类的定义?当我删除该字段时,javassist 是否有助于删除以下字段引用:
public OneService getOneService(){
if(oneService==null) {//some initialization steps }
return oneService;
}
非常感谢。