2012-07-09 57 views
0

因此,這裏是字節碼的片段,我正在嘗試使用ASM的類驗證,驗證:ClassNotFound的錯誤

public <init>(Ljava/io/InputStream;)V 
    ALOAD 0 
    ALOAD 1 
    SIPUSH 2048 
    NEW org/apache/xerces/impl/msg/XMLMessageFormatter 
    DUP 
    INVOKESPECIAL org/apache/xerces/impl/msg/XMLMessageFormatter.<init>()V 
    INVOKESTATIC java/util/Locale.getDefault()Ljava/util/Locale; 
    INVOKESPECIAL org/apache/xerces/impl/io/UTF8Reader.<init> (Ljava/io/InputStream;ILorg/apache/xerces/util/MessageFormatter;Ljava/util/Locale;)V 
    RETURN 
    MAXSTACK = 5 
    MAXLOCALS = 2 

這是屬於較大類org/apache/xerces/impl/io/UTF8Reader的一部分。現在,當我通過ASM提供的驗證類運行這個類的字節碼,我得到如下結果:

org.objectweb.asm.tree.analysis.AnalyzerException: **Error at instruction 7: java.lang.ClassNotFoundException: org.apache.xerces.util.MessageFormatter** 
    at org.objectweb.asm.tree.analysis.Analyzer.analyze(Unknown Source) 
    at org.objectweb.asm.util.CheckClassAdapter.verify(Unknown Source) 
    at org.objectweb.asm.util.CheckClassAdapter.verify(Unknown Source) 
    at org.objectweb.asm.util.CheckClassAdapter.main(Unknown Source) 
Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: org.apache.xerces.util.MessageFormatter 
    at org.objectweb.asm.tree.analysis.SimpleVerifier.getClass(Unknown Source) 
    at org.objectweb.asm.tree.analysis.SimpleVerifier.isAssignableFrom(Unknown Source) 
    at org.objectweb.asm.tree.analysis.SimpleVerifier.isSubTypeOf(Unknown Source) 
    at org.objectweb.asm.tree.analysis.BasicVerifier.naryOperation(Unknown Source) 
    at org.objectweb.asm.tree.analysis.BasicVerifier.naryOperation(Unknown Source) 
    at org.objectweb.asm.tree.analysis.Frame.execute(Unknown Source) 
    ... 4 more 
<init>(Ljava/io/InputStream;)V 
00000 UTF8Reader InputStream : :  ALOAD 0 
00001 UTF8Reader InputStream : UTF8Reader :  ALOAD 1 
00002 UTF8Reader InputStream : UTF8Reader InputStream :  SIPUSH 2048 
00003 UTF8Reader InputStream : UTF8Reader InputStream I :  NEW org/apache/xerces/impl/msg/XMLMessageFormatter 
00004 UTF8Reader InputStream : UTF8Reader InputStream I XMLMessageFormatter :  DUP 
00005 UTF8Reader InputStream : UTF8Reader InputStream I XMLMessageFormatter XMLMessageFormatter :  INVOKESPECIAL org/apache/xerces/impl/msg/XMLMessageFormatter.<init>()V 
00006 UTF8Reader InputStream : UTF8Reader InputStream I XMLMessageFormatter :  INVOKESTATIC java/util/Locale.getDefault()Ljava/util/Locale; 
00007 UTF8Reader InputStream : UTF8Reader InputStream I XMLMessageFormatter Locale :  INVOKESPECIAL org/apache/xerces/impl/io/UTF8Reader.<init> (Ljava/io/InputStream;ILorg/apache/xerces/util/MessageFormatter;Ljava/util/Locale;)V 
00008 ?  :  RETURN 

我深受這最後有點迷茫......爲什麼它給了ClassNotFound的第7行的org/apache/xerces/util/MessageFormatter對象異常?

謝謝。

+0

我熟悉Java而不是ASM。一些想法(道歉,如果這些太明顯):所以你通過ASM加載UTF8Reader字節碼?整個xerces jar是以這種方式加載的嗎?或者只是一些課程? MessageFormatter如何?如果沒有,你期望它進入classpath並加載? (可以幫助你知道你是如何調用ASM的。) – Will 2012-07-09 21:19:29

+0

所以我通過java.lang.instrument加載UTF8Reader和MessageFormatter。我基本上是編寫一個java代理,它可以加載類的時間檢測。現在,在加載類的字節碼時,我將它們分別存儲在它們自己的文件中,我將其用於稍後在脫機過程中進行驗證,即在程序成功執行後進行驗證。請注意,程序正在成功執行。謝謝。 – vijay 2012-07-09 21:46:36

+0

也,這可能也有幫助,http://mail-archive.ow2.org/asm/2011-08/msg00051.html這是否有任何意義?再次感謝。 – vijay 2012-07-09 21:49:51

回答

1

ASM的驗證工具根據JVM規範檢查每個堆棧和可變槽的有效性。其中一項檢查是所有變量和堆棧槽中的值在合併點處具有相同的類型。所以,這個實現加載類來找到常見的超類型。

+0

謝謝!你是對的。檢查器無法在加載它時找到org/apache/xerces/util/MessageFormatter的類文件,因此無法正確驗證它。一旦我將它包含在類路徑中,它就全部解決了。 – vijay 2012-07-10 17:31:02