2012-07-02 7 views
6

Uzyskiwanie błąd na instrumentacjibłąd podczas instrumentacji pliki klasa (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) 

podczas instrumentacji klas

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 

Czytam powyższy zestaw klas jako strumienie bajtowe używając apache commonsIO .

Następnie za pomocą biblioteki asm oprzyrządowanie ich.

Wreszcie są konwertowane na pliki klas.

W tym punkcie oprzyrządowania dostaję ten błąd Czy ktoś może uprzejmie wyjaśnić przyczynę i możliwe rozwiązanie.

Odpowiedz

7

Ten błąd występuje, ponieważ ASM generuje ramki mapy stosu, a dla niektórych bajtów ramki mapy stosu muszą zawierać wspólną nadklasę dwóch klas. Domyślnie ASM implementuje to przez ładowanie klas przez Class.forName, a następnie implementuje odpowiedni algorytm za pomocą odbicia. Przypuszczalnie biblioteka ASM nie może załadować twojej klasy Depozytu z jej modułu ładującego klasy.

Aby uniknąć błędu, musisz albo użyć SKIP_FRAMES (uwaga: wersja pliku klasy 5.0.0 używanego przez Javę 7 wymaga ramek mapowania stosu, więc jest to nieopcjonalne, jeśli generujesz kod bajtowy Java 7) lub potrzebujesz podklasy ClassWriter i przesłonić getCommonSuperClass. Zależnie od tego, co robi twój kod, być może będziesz mógł zakodować odpowiedzi w sposób ciągły za pomocą porównań ciągów lub możesz wziąć implementację ASM i przepisać ją, aby użyć określonej klasy Classoader.

+0

Próbuję zaimplementować getCommonSuperClass, a aby uzyskać ładowane klasy, używam obiektu instrumentacji, tj. InstrumentObj.getAllLoadedClasses(). Ale co, jeśli niektóre klasy nie są tutaj również? – AKS

+0

@AKS Prawdopodobnie lepiej jest rozpocząć nowe pytanie i odnieść się do tej odpowiedzi, niż skomentować tak starą odpowiedź. Powiedział, że nie ma tu magii: musisz jakoś znaleźć odpowiedź. Jeśli próbujesz użyć getAllLoadedClasses, ale klasa nie jest załadowana, będziesz musiał zrobić coś innego, aby uzyskać odpowiedź (np. Użyj getResource, aby mieć nadzieję znaleźć bajty klas, aby znaleźć odpowiedź). –

+0

Ya, rozpocząłeś nowe pytanie. Dzięki! – AKS

Powiązane problemy