2012-07-02 9 views
6

उपकरणके दौरान त्रुटि वर्ग फ़ाइलों (asm.ClassWriter.getCommonSuperClass)

java.lang.RuntimeException: java.lang.ClassNotFoundException: Deposit 
    at org.objectweb.asm.ClassWriter.getCommonSuperClass(Unknown Source) 
    at org.objectweb.asm.ClassWriter.a(Unknown Source) 
    at org.objectweb.asm.Frame.a(Unknown Source) 
    at org.objectweb.asm.Frame.a(Unknown Source) 
    at org.objectweb.asm.MethodWriter.visitMaxs(Unknown Source) 
    at com.jConSequence.instrumentor.methodProber.AdddataBaseDetailsInstructions$AdddataBaseDetailsMethodInstructions.visitMaxs(AdddataBaseDetailsInstructions.java:131) 
    at org.objectweb.asm.ClassReader.accept(Unknown Source) 
    at org.objectweb.asm.ClassReader.accept(Unknown Source) 
    at com.jConSequence.instrumentor.PrintLoadedClasses.print(PrintLoadedClasses.java:31) 
    at com.jConSequence.tooGUI.RevEnggToolGUI.jButton1ActionPerformed(RevEnggToolGUI.java:487) 
    at com.jConSequence.tooGUI.RevEnggToolGUI.access$0(RevEnggToolGUI.java:471) 
    at com.jConSequence.tooGUI.RevEnggToolGUI$1.actionPerformed(RevEnggToolGUI.java:127) 
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) 
    at java.awt.Component.processMouseEvent(Unknown Source) 
    at javax.swing.JComponent.processMouseEvent(Unknown Source) 
    at java.awt.Component.processEvent(Unknown Source) 
    at java.awt.Container.processEvent(Unknown Source) 
    at java.awt.Component.dispatchEventImpl(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Window.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$000(Unknown Source) 
    at java.awt.EventQueue$1.run(Unknown Source) 
    at java.awt.EventQueue$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue$2.run(Unknown Source) 
    at java.awt.EventQueue$2.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 

पर त्रुटि आ रही है instrumenting अपाचे commonsIO का उपयोग कर बाइट धाराओं के रूप में कक्षाएं

D:\workspaces\workspace\bankManagement\bin\Account.class 
D:\workspaces\workspace\bankManagement\bin\ATM.class 
D:\workspaces\workspace\bankManagement\bin\ATMCaseStudy.class 
D:\workspaces\workspace\bankManagement\bin\BalanceInquiry.class 
D:\workspaces\workspace\bankManagement\bin\BankDatabase.class 
D:\workspaces\workspace\bankManagement\bin\CashDispenser.class 
D:\workspaces\workspace\bankManagement\bin\Deposit.class 
D:\workspaces\workspace\bankManagement\bin\DepositSlot.class 
D:\workspaces\workspace\bankManagement\bin\Keypad.class 
D:\workspaces\workspace\bankManagement\bin\Screen.class 
D:\workspaces\workspace\bankManagement\bin\Transaction.class 

मैं वर्गों के ऊपर सेट पढ़ रहा हूँ instrumenting जबकि ।

फिर एएसएम लाइब्रेरी का उपयोग करके उनका उपयोग करना।

अंत में वे कक्षा फ़ाइलों में परिवर्तित हो जाते हैं।

यह उपकरण के इस बिंदु पर मुझे यह त्रुटि मिल रही है क्या कोई कृपया कारण और संभावित समाधान की व्याख्या कर सकता है।

उत्तर

7

यह त्रुटि तब हो रही है क्योंकि एएसएम स्टैक मैप फ्रेम उत्पन्न कर रहा है, और कुछ बाइटकोड के लिए, स्टैक मैप फ्रेम में दो वर्गों का सामान्य सुपरक्लास होना चाहिए। डिफ़ॉल्ट रूप से, एएसएम वर्ग को कक्षा.forName के माध्यम से लोड करके इसे प्रतिबिंबित करता है और फिर प्रतिबिंब का उपयोग करके उचित एल्गोरिदम लागू करता है। संभवतः, एएसएम लाइब्रेरी अपने जमा वर्ग को अपने वर्ग लोडर से लोड करने में असमर्थ है।

त्रुटि से बचने के लिए, आपको या तो SKIP_FRAMES का उपयोग करने की आवश्यकता होगी (नोट: जावा 7 द्वारा उपयोग की जाने वाली क्लास फ़ाइल के संस्करण 51.0 में स्टैक मैप फ्रेम की आवश्यकता होती है, इसलिए यदि आप जावा 7 बाइटकोड उत्पन्न कर रहे हैं तो यह एक गैर-विकल्प है) , या आपको क्लासवाइटर को उपclass करने और getCommonSuperClass को ओवरराइड करने की आवश्यकता है। आपका कोड क्या कर रहा है, इस पर निर्भर करता है, शायद आप स्ट्रिंग तुलना का उपयोग करके उत्तरों को कड़ी-कोड कर सकते हैं, या शायद आप एएसएम कार्यान्वयन ले सकते हैं और आपके द्वारा निर्दिष्ट क्लासलोडर का उपयोग करने के लिए इसे फिर से लिख सकते हैं।

+0

मैं getCommonSuperClass को लागू करने की कोशिश कर रहा हूं, और लोड किए गए वर्ग प्राप्त करने के लिए, मैं उपकरण ऑब्जेक्ट का उपयोग कर रहा हूं, यानी instrumentObj.getAllLoadedClasses()। लेकिन क्या होगा यदि कुछ कक्षाएं यहां मौजूद नहीं हैं? – AKS

+0

@AKS इस तरह के पुराने उत्तर पर टिप्पणी करने के बजाय यह एक नया प्रश्न शुरू करने और इस उत्तर का संदर्भ देने के लिए शायद बेहतर है। उस ने कहा, यहां कोई जादू नहीं है: आपको किसी भी तरह का जवाब मिलना है। यदि आप getAllLoadedClasses का उपयोग करने का प्रयास कर रहे हैं लेकिन कक्षा लोड नहीं की गई है, तो आपको उत्तर पाने के लिए कुछ और करना होगा (उदाहरण के लिए, उत्तर खोजने के लिए क्लास बाइट्स को उम्मीदपूर्वक प्राप्त करने के लिए getResource का उपयोग करें)। –

+0

हां, एक नया सवाल शुरू किया। धन्यवाद! – AKS

संबंधित मुद्दे