का उपयोग करके फ़ील्ड के प्रारंभिक मान को कैसे बदला जाए, मैं अपने विकासशील एनवी में कुछ सेवाओं का नकल करने की कोशिश कर रहा हूं।javassist
public class ApiFacadeImpl implements ApiFacade {
private OneService oneService = null;
public OneService getOneService(){
if(oneService==null) {//some initialization steps }
return oneService;
}
}
मैं इस कारखाने में अच्छी तरह से कोडित और नहीं बनाया गया है पता है: serviceFactory कोड कुछ की तरह है। हालांकि मैं इसके कोड को संशोधित नहीं कर सकता। मेरा विचार बाईटकोड को बदलने के लिए है, इसलिए मैं यह की तरह कुछ करने के लिए फिर से परिभाषित कर सकते हैं:
public class ApiFacadeImpl implements ApiFacade {
private OneService oneService = new MyMockOneService();
....
}
मेरे 1st है: यह संभव javassist का उपयोग कर रहा है? और कैसे?
जब से मैं गूगल का उपयोग करते हुए javassist का उपयोग करके फ़ील्ड reinitialize की तरह कुछ भी नहीं मिल सकता है, मैं अपने आप को हटाकर उसे करने की कोशिश की और इसे पुन::
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)
मेरा दूसरा प्रश्न यह अपवाद क्यों है? कौन सा कदम अवज्ञा जावा वर्ग की परिभाषा?
public OneService getOneService(){
if(oneService==null) {//some initialization steps }
return oneService;
}
बहुत धन्यवाद: और जब मैं क्षेत्र को नष्ट javassist में क्षेत्र संदर्भ को नष्ट करने में मदद करता है।
mockClass.getCanonicalName क्या है()? – longhua
आपका जाववादी संस्करण क्या है? – longhua