2012-07-09 2 views
0

그래서 여기 내가 ASM의 클래스 검증을 사용하여 확인하기 위해 노력하고 바이트 코드의 조각이다 org/apache/xerces/impl/io/UTF8Reader 클래스의 일부입니다. 내가 ASM에서 제공하는 클래스의 검증을 통해이 클래스의 바이트 코드를 실행하면 이제, 나는 다음과 같은 결과를 얻을 :면 ClassNotFound 오류가

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

저는 ASM이 아닌 Java에 익숙합니다. 몇 가지 아이디어 (사과가 너무 분명한 경우) : ASM을 통해 UTF8Reader를 바이트 코드로로드하고 있습니까? 그런 식으로 모든 xerces 항아리가로드되고 있습니까? 아니면 어떤 수업입니까? MessageFormatter는 어떻습니까? 그렇지 않다면 어디에서 클래스 패스에 들어가로드 될 것으로 예상합니까? (당신이 ASM을 호출하는 방법을 아는 데 도움이 될 수 있습니다.) – Will

+0

그래서 java.lang.instrument를 통해 UTF8Reader와 MessageFormatter를로드하고 있습니다. 기본적으로 클래스의 시간 계측을로드하는 Java 에이전트를 작성하고 있습니다. 이제 클래스의 바이트 코드를로드하는 동안 파일을 별도로 저장합니다.이 파일은 나중에 오프라인 프로세스에서 확인하는 데 사용됩니다. 즉 프로그램이 성공적으로 실행 된 후입니다. 프로그램이 성공적으로 실행되고 있음을주의하십시오. 감사. – vijay

+0

또한 도움이 될 수 있습니다. http://mail-archive.ow2.org/asm/2011-08/msg00051.html이 내용이 의미가 있습니까? 다시 한 번 감사드립니다. – vijay

답변

1

ASM의 검증 도구는 JVM 사양에 따라 각 스택 및 가변 슬롯의 유효성을 검사합니다. 검사 중 하나는 모든 변수 및 스택 슬롯의 값이 병합 지점에서 동일한 유형이라는 것입니다. 따라서이 구현은 일반적인 수퍼 유형을 찾기 위해 클래스를로드합니다.

+0

감사! 당신 말이 맞아요. 검사기가 org/apache/xerces/util/MessageFormatter의 클래스 파일을로드하려고 할 때 해당 클래스 파일을 찾을 수 없어 제대로 검사 할 수 없었습니다. 일단 클래스 패스에 포함 시키면 모두 효과가있었습니다. – vijay