2015-10-23 11 views
19

का उपयोग करके एक ऐरेलिस्ट बनाने के लिए कैसे मैं उपकरण के दौरान एक विधि में सरणी सूची जोड़ना चाहता हूं। मैंने इसका उल्लेख किया है (Javassist CannotCompileException when trying to add a line to create a Map) लेकिन यह java.lang.VerifyError के साथ एक अलग अपवाद फेंकता है।जावस्सिस्ट

public void createInsertBefore(String scenarioName, String className, CtMethod method, 
            String insertBefore) throws CannotCompileException { 
     method.addLocalVariable("startTime", CtClass.longType); 
     StringBuilder bBuilder = new StringBuilder(); 
     bBuilder.append("startTime = System.nanoTime();"); 
     bBuilder.append("System.out.println(startTime);"); 

     if((insertBefore!=null) && !insertBefore.isEmpty()){ 
      bBuilder.append(insertBefore); 
     } 

     bBuilder.append("java.util.List metadata = new java.util.ArrayList();"); 

     System.out.println(bBuilder.toString()); 
     method.insertBefore(bBuilder.toString()); 
} 

प्रिंट बयान से प्राप्त आउटपुट,

startTime = System.nanoTime(); 
System.out.println(startTime); 
java.util.List metadata = new java.util.ArrayList(); 

Exception in thread "main" java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:382) 
    at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:397) 
Caused by: java.lang.VerifyError 
    at sun.instrument.InstrumentationImpl.retransformClasses0(Native Method) 
    at sun.instrument.InstrumentationImpl.retransformClasses(InstrumentationImpl.java:144) 
    at org.wso2.das.javaagent.instrumentation.Agent.premain(Agent.java:57) 
    ... 6 more 
FATAL ERROR in native method: processing of -javaagent failed 
Aborted (core dumped) 

स्थिति पहले जैसी ही है है लेकिन यह निम्न अपवाद फेंकता है,, लेकिन क्यों यह एक अलग अपवाद है । क्या मैं गलत कर रहा हूँ .... कुछ मदद कृपया ...

अद्यतन 1

लाइनों के साथ जोड़ा (मैं कुछ प्रिंट लाइनों को हटा दिया है), insertBefore,

startTime = System.nanoTime(); 
java.util.List metadata = new java.util.ArrayList(); 

insertAt

System.out.println("prepareStatement is running"); 
java.util.Map/*<String,String>*/ arbitraryMap = new java.util.HashMap/*String,String>*/(); 
arbitraryMap.put("query",$1);System.out.println(arbitraryMap); 

insertAfter

System.out.println(System.nanoTime()-startTime); 
+0

देशी कोड में एक त्रुटि की तरह दिखता है। – Thomas

+0

आपका क्या मतलब है? यू मतलब बाकी कोड है? मैंने सोचा कि समस्या उस कथन के साथ है, क्योंकि अगर मैं उस पंक्ति पर टिप्पणी करता हूं, तो उपकरण ठीक काम करता है। इसलिए मुझे लगता है कि यह कथन के साथ कुछ गलत है। – udani

+0

आपका कोड गलत हो सकता है लेकिन त्रुटि यहां होती है: 'sun.instrument.InstrumentationImpl.retransformClasses0 (मूल विधि) 'यानी यह मूल कोड के भीतर है। आपके द्वारा प्राप्त त्रुटि पर JavaDoc कहता है: 'जब "सत्यापनकर्ता" यह पता लगाता है कि एक वर्ग फ़ाइल, हालांकि अच्छी तरह से बनाई गई है, में कुछ प्रकार की आंतरिक असंगतता या सुरक्षा समस्या है। - यह उस वर्ग पर निर्भर हो सकता है जिसे बढ़ाया जा रहा है, शायद आप दो बार डालने की कोशिश कर रहे हैं या पहले से ही 'स्टार्टटाइम', 'मेटाडाटा' नामक एक चर है। – Thomas

उत्तर

6

एक VerifyError तब होता है जब वी एम नोटिस, जो एक पहले से संकलित बाईटकोड मान्य नहीं है। उदाहरण के लिए, जब आप एक पूर्णांक, या समान चीजों के लिए लोड निर्देश का उपयोग करके एक लंबे चर को पढ़ने का प्रयास करते हैं।

तो, आपके मामले में, कोड संकलित करता है, जावासाइस्ट इसका जादू करता है, लेकिन वीएम कोड स्वीकार नहीं करता है। यह या तो जावासवादी या इसके उपयोग में एक बग में एक बग होना चाहिए।

इसे कैसे ठीक करें:

1) जहाँ तक मुझे पता है, आप केवल एक बयान (नहीं एक पंक्ति) एक विधि insertBefore का उपयोग कर की शुरुआत में जोड़ सकते हैं। यदि आप एक से अधिक जोड़ना चाहते हैं, तो उन्हें {} में लपेटें, method.insertBefore("{" + bBuilder.toString() + "}" जैसे कुछ);

2) की तरह आप startTime

एक्स) इस या किसी अन्य त्रुटि अभी भी बनी रहती है, डिस्क पर एक फ़ाइल में वर्ग फ़ाइल लिखने की कोशिश के साथ किया था तुम एक चर के रूप में मेटाडाटा में नहीं जोड़ा था (toClassFile आप उपयोग कर सकते हैं संशोधित वर्ग फ़ाइल को byte[] के रूप में एक्सेस करें)। फिर आप संकलित कोड को देखने के लिए जावप जैसे टूल का उपयोग कर सकते हैं, और अधिक स्पष्ट रूप से देख सकते हैं कि क्या हो रहा है।