2014-02-05 28 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