2012-07-02 20 views
6

Bắt lỗi trên thiết bị đo đạcLỗi khi instrumenting file class (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) 

khi instrumenting lớp

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 

Tôi đọc tập trên lớp như byte suối sử dụng apache commonsIO .

Sau đó, sử dụng thư viện asm được trang bị cho chúng.

Cuối cùng, chúng được chuyển thành tệp lớp.

Tại thời điểm này, tôi nhận được lỗi này

Trả lời

7

Lỗi này xảy ra vì ASM đang tạo khung bản đồ ngăn xếp và đối với một số bytecode, khung bản đồ ngăn xếp phải chứa siêu lớp chung của hai lớp. Theo mặc định, ASM thực hiện điều này bằng cách tải các lớp qua Class.forName và sau đó thực hiện thuật toán thích hợp bằng cách sử dụng sự phản chiếu. Có lẽ, thư viện ASM không thể nạp lớp tiền gửi của bạn từ trình nạp lớp của nó.

Để tránh lỗi, bạn cần sử dụng SKIP_FRAMES (lưu ý: phiên bản 51.0 của tệp lớp được Java 7 sử dụng yêu cầu khung bản đồ chồng, vì vậy đây không phải là tùy chọn nếu bạn đang tạo Java bytecode) hoặc bạn cần phải phân lớp ClassWriter và ghi đè getCommonSuperClass. Tùy thuộc vào những gì mã của bạn đang làm, có lẽ bạn có thể mã hóa cứng các câu trả lời bằng cách sử dụng so sánh chuỗi, hoặc có lẽ bạn có thể thực hiện ASM và viết lại nó để sử dụng một ClassLoader mà bạn chỉ định.

+0

Tôi đang cố gắng triển khai getCommonSuperClass và để tải các lớp đã tải, tôi đang sử dụng đối tượng thiết bị đo đạc, ví dụ: instrumentObj.getAllLoadedClasses(). Nhưng nếu một số lớp học không có mặt ở đây thì sao? – AKS

+0

@AKS Có lẽ tốt hơn nên bắt đầu một câu hỏi mới và tham khảo câu trả lời này hơn là nhận xét về câu trả lời cũ như vậy. Điều đó nói rằng, không có phép thuật ở đây: bạn phải bằng cách nào đó có được câu trả lời. Nếu bạn đang cố gắng sử dụng getAllLoadedClasses nhưng lớp không được tải, bạn sẽ phải làm một việc khác để nhận câu trả lời (ví dụ: sử dụng getResource để hy vọng tìm thấy các byte lớp để tìm câu trả lời). –

+0

Ya, bắt đầu một câu hỏi mới. Cảm ơn! – AKS

Các vấn đề liên quan