2010-02-10 87 views
1

當我嘗試加載使用ASM生成的類時,出現ClassVerifyErrors錯誤。在進一步的檢查中,我可以看到jvm是正確的,並且該方法正在討論具有無效的MAX_STACK值。奇怪的是我正在使用自動計算堆棧和最大本地選項,所以這應該不成問題... 帶有無效選項的方法非常簡單,但結果卻是錯誤的字節碼。ASM(來自ObjectWeb)即使設置了ClassWriter(COMPUTE_MAX + COMPUTE_STACK),也不能正確計算MaxStack

我寫了一個類與預期的方法和比較我的asm生成的類與javac產生的和字節碼匹配與唯一的錯誤是最大堆棧是0這是錯誤的,而javac設置爲2的值。

編號喜歡避免必須自己計算最大堆棧/本地人。

回答

6

如果字節碼無效,則最大堆棧和變量計算可能會產生錯誤的結果。您可以通過運行CheckClassAdapter生成的代碼來驗證。

例如,

ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS); 
    // generate code into cw instance... 

    PrintWriter pw = new PrintWriter(System.out); 
    CheckClassAdapter.verify(new ClassReader(cw.toByteArray()), true, pw); 
+0

感謝名單尤金的答案和ASM :) 我的問題是通過沒有結束先前生成的方法和創建另一個這在某種程度上意味着發電機實例是在一個混亂狀態引起。 – 2010-02-11 00:55:58

相關問題