2014-02-05 65 views
0

我正在使用ASM字節碼閱讀器來解析代碼中存在的.class文件。 但我想要得到在int類將在xml中提及的類中定義的特定字符串。ASM根據xml中定義的規則解析.class

那麼如何使用XML並解析.class中存在的字符串。正如我所看到的那樣,ClassReader僅將.class作爲參數而不是XML或任何其他格式。

我使用的是這樣的:

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

ClassReader classReader=new ClassReader(in); 

classReader.accept(v, 0); 

請告訴我,有沒有什麼辦法來解析的.class反對在XML文件中定義的規則?

在此先感謝...

衙署

+1

你接受他的讀者(你的樣本中的v)應該包含所有的自定義邏輯。傳入您想要的ClassVisitor的子類(包括XML相關的東西)。 –

+1

您爲什麼期望'ClassReader'將您的XML作爲輸入?它應該如何知道如何處理它?程序員的生活中有一點需要他自己去實現預期的行爲。 – Holger

+0

嗨非常感謝,我以同樣的方式嘗試,但沒有取得成功,因爲我對java很陌生,沒有想到它:)非常感謝 – priyank

回答

1

據我瞭解,你要做到以下幾點:您收到一個的.class文件,然後你要提取某種信息從它在XML文件中指定它。如果是這樣的話:ASM不需要知道你需要什麼類型的信息。 ASM將清楚地讀取類文件。如果你清楚地想知道,如果某些特定String是類的常量池中的一部分,你可以使用了一條捷徑被通知是:覆蓋ClassReaderreadUTF8(int, char[])方法是這樣的:

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; 
    } 
} 

當然你必須提供一些知道您感興趣的邏輯:如果您例如具有包含特定單詞的XML文件,則需要解析該文件並提取這些單詞。您可以查詢這些String s的MyClassReader

+0

嗨,感謝您的回覆。我嘗試了這種方式,並以這種方式訪問​​字符串InputStream in = ASMHelloWorld.class.getResourceAsStream(「Test.class」); MyClassReader classReader = new MyClassReader(in); classReader.hasString(「lang」);但即使字符串lang存在於test.class中,它總是給出false。請幫助.... – priyank

+0

你可以發佈'Test.class'嗎? –

+0

嗨,我的Test.java只是印刷包含的String 「郎」 公共類測試{ \t \t 公共靜態無效主要(字符串的argv []){ \t \t 字符串\t打印= 「你好郎」; \t \t \t \t System.out.println(print); \t }} 請幫助我爲什麼我不能夠得到字符串和結果爲真? – priyank