2012-07-02 5 views
6

Fehler auf InstrumentierungFehler beim Instrumentieren Klassendateien (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) 

während Klassen instrumentiert

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 

Ich lese die oben Satz von Klassen als Byte-Streams mit Apache commonsIO Erste .

Dann mit Asm-Bibliothek instrumentieren sie.

Schließlich werden sie in Klassendateien konvertiert.

Es ist an dieser Stelle der Instrumentierung Ich bekomme diesen Fehler Kann jemand den Grund und die mögliche Lösung erklären.

Antwort

7

Dieser Fehler tritt auf, weil ASM Stack-Map-Frames generiert. Bei einigen Bytecodes müssen die Stack-Map-Frames die gemeinsame Oberklasse aus zwei Klassen enthalten. Standardmäßig implementiert ASM dies durch Laden der Klassen über Class.forName und implementiert dann den richtigen Algorithmus mithilfe der Reflektion. Vermutlich kann die ASM-Bibliothek Ihre Deposit-Klasse nicht von ihrem Klassenlader laden.

Um den Fehler zu vermeiden, müssen Sie entweder SKIP_FRAMES verwenden (Anmerkung: Version 51.0 der von Java 7 verwendeten Klassendatei erfordert Stack Map Frames, dies ist also keine Option, wenn Sie Java 7 Bytecode generieren) oder Sie müssen ClassWriter von der Klasse ableiten und getCommonSuperClass überschreiben. Je nachdem, was Ihr Code tut, können Sie die Antworten möglicherweise mit Zeichenfolgenvergleichen fest codieren. Oder Sie können die ASM-Implementierung verwenden und sie so umschreiben, dass sie einen von Ihnen angegebenen ClassLoader verwendet.

+0

Ich versuche, GetCommonSuperClass zu implementieren, und um die geladenen Klassen zu erhalten, verwende ich Instrumentierungsobjekt, d. H. InstrumentObj.getAllLoadedClasses(). Aber was ist, wenn einige Klassen hier nicht anwesend sind? – AKS

+0

@AKS Es ist wahrscheinlich besser, eine neue Frage zu beginnen und auf diese Antwort zu verweisen, als eine so alte Antwort zu kommentieren. Das heißt, es gibt keine Magie hier: Sie müssen irgendwie die Antwort bekommen. Wenn Sie versuchen, getAllLoadedClasses zu verwenden, aber die Klasse nicht geladen ist, müssen Sie etwas anderes tun, um eine Antwort zu erhalten (z. B. verwenden Sie getResource, um hoffentlich die Klassenbytes zu finden, um die Antwort zu finden). –

+0

Ya, begann eine neue Frage. Vielen Dank! – AKS