2014-02-05 4 views
0

ASM 바이트 코드 판독기를 사용하여 코드에있는 .class 파일을 구문 분석합니다. 그러나 Inturn이 XML 내부에서 언급 될 클래스에 정의 된 특정 문자열을 가져 오려고합니다.XML에서 정의 된 규칙에 대해 .class를 구문 분석 할 ASM

그래서 XML을 사용하고 .class에있는 문자열을 구문 분석하는 방법. ClassReader는 XML이나 다른 형식이 아닌 매개 변수로 .class를 사용합니다.

나는이 같은 것을 사용하고 있습니다 :

InputStream in=String.class.getResourceAsStream("/java/lang/String.class"); 

ClassReader classReader=new ClassReader(in); 

classReader.accept(v, 0); 

XML 파일에 정의 된 규칙에의 .class 구문 분석 할 수있는 방법이 말해 주 시겠어요? 당신은 의 .class 파일을 수신하고 있고 다음 정보가 어떤 종류의 압축을 : 나는 그것을 알고있는 것처럼 사전에

감사합니다 ...

Yashu는

+1

당신이 독자에게 받아 들인 방문객 (샘플의 v)은 모든 사용자 지정 논리를 포함해야합니다. ClassVisitor의 하위 클래스를 전달하여 원하는 것을 수행합니다 (XML 관련 항목 포함). –

+1

왜'ClassReader'가 XML을 입력으로 받아 들일 것으로 기대합니까? 어떻게해야 알 수 있을까요? 프로그래머가 자신이 원하는 동작을 구현해야하는 지점이 있습니다. – Holger

+0

안녕하세요 고마워, 같은 방식으로 노력했지만 성공하지 못했습니다. 자바에 대해 매우 신감스럽게 생각합니다 :) 감사합니다. – priyank

답변

1

, 다음을 수행 할 이 파일은 XML 파일에 지정되어 있습니다. 이것이 사실이라면 : ASM은 당신이 요구하는 정보의 종류에 대해 알 필요가 없습니다. ASM은 분명히 클래스 파일을 읽을 것입니다. 당신은 분명 일부 특정 String 클래스의 상수 풀의 일부가 있는지 알고 싶은 경우에, 당신은 그 통지받은위한 지름길을 사용할 수 있습니다 :이 같은 ClassReaderreadUTF8(int, char[]) 방법 오버라이드 (override) : 물론

public MyClassReader extends ClassReader { 

    private final Set<String> constantPoolStrings = new HashSet<String>(); 

    // Add constructors here 

    @Override 
    public String readUTF8(int index, char[] buf) { 
    String value = super.readUTF8(index, buf); 
    constantPoolStrings.add(value); 
    return value; 
    } 

    public boolean hasString(String value) { 
    // From the details in your comment, we will need to do a fuzzy search. 
    for(String poolString : constantPoolStrings) { 
     if(poolString.contains(value)) { 
     return true; 
     } 
    } 
    return false; 
    } 
} 

당신 String을 알고있는 논리를 제공해야합니다. 예를 들어 특정 단어가 포함 된 XML 파일이 있으면이 파일을 구문 분석하고이 단어를 추출해야합니다. 이 String에 대해 MyClassReader을 쿼리 할 수 ​​있습니다.

+0

안녕하십니까. 나는 똑같은 시도하고 이런 식으로 문자열을 액세스 InputStream = ASMHelloWorld.class.getResourceAsStream ("Test.class"); MyClassReader classReader = 새 MyClassReader (입력); classReader.hasString ("lang"); string lang이 test.class에 있어도 결과는 false가됩니다. 도와주세요 .... – priyank

+0

'Test.class'를 게시 할 수 있습니까? –

+0

안녕, 내 Test.java 단지가 포함 된 문자열을 인쇄하고 "LANG"공용 클래스 테스트 { \t \t 공공 정적 무효 메인 ([]는 argv 문자열) { \t \t \t 문자열 인쇄 = "안녕하세요 LANG"; \t \t \t \t System.out.println (인쇄); \t }} pls 왜 내가 문자열과 결과를 얻을 수 없습니까? – priyank