kullanarak alanın başlangıç değeri nasıl değiştirilir Gelişmekte olan env'de bazı servisler alay etmeye çalışıyorum. ServiceFactory kodu şunun gibidir:javassist
public class ApiFacadeImpl implements ApiFacade {
private OneService oneService = null;
public OneService getOneService(){
if(oneService==null) {//some initialization steps }
return oneService;
}
}
Bu fabrikanın iyi kodlanmadığını ve tasarlanmadığını biliyorum. Ancak kodunu değiştiremiyorum. benim fikrim bayt kodu değiştirmektir, bu yüzden gibi bir sunucu yeniden tanımlayabilirsiniz:
public class ApiFacadeImpl implements ApiFacade {
private OneService oneService = new MyMockOneService();
....
}
Benim 1 geçerli: Bu mümkün kullanarak javassist nedir? Ve nasıl? Ben google kullanarak javassist kullanarak alan yeniden başlatmak gibi bir şey bulamıyorum yana
, bunu silerek kendim denedim ve yeniden:
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();
sonra aldığım istisna:
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)
Benim ikinci sorum, bu istisna neden? Java sınıfının tanımına hangi adım uymuyor?
public OneService getOneService(){
if(oneService==null) {//some initialization steps }
return oneService;
}
çok teşekkür: Ve alanını sildiğinizde alan başvuru silmek için yardımcı javassist yapar.
mockClass.getCanonicalName nedir()? – longhua
Javassist sürümünüz nedir? – longhua