2014-02-06 50 views
0

您好我想使用ASM在/java/lang/String.class文件中搜索特定的字符串。我才知道,下面的方法確實是在.class文件中搜索字符串的ASM

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

,但不知道如何使用它。我是張貼我的代碼,你可以請告訴我如何都可以在此achived。

public class DemoClassReader { 
public static void main(String[] args) throws IOException { 
ClassVisitor v= new ClassVisitor(Opcodes.ASM4) { 
      @Override 

public void visit(int version, int access, String name, 
           String signature, String superName, String[] interfaces) { 

System.out.println(" class: "+name); 
super.visit(version, access, name, signature, superName, interfaces); 
      } 
        } ; 

InputStream in=String.class.getResourceAsStream("/java/lang/String.class"); 
ClassReader classReader=new ClassReader(in); 
classReader.accept(v, 0); 
    } 
+0

存儲在類文件中的字符串有很多種。你想要搜索什麼?例如,方法名稱,類型名稱,簽名,字符串文字? –

+0

嗨,感謝您的回覆。它可以是任何像定義變量的字符串;字符串名稱=「約翰邁勒」,我想要約翰。這可以如何實現? – priyank

+0

只需查找常量池中的所有字符串條目即可。看看utf8會讓你看到所有不用於常量的字符串。 – Antimony

回答

2

用於捕捉您可以實現以下MethodVisitor中字符串字面量:

ClassReader classReader = new ClassReader(in); 
classReader.accept(new ClassVisitor(Opcodes.V1_7) { 
    public visitMethod(int access, String name, String desc, 
     String signature, String[] exceptions) { 
    return new MethodVisitor(Opcodes.V1_7) { 
     public void visitLdcInsn(Object cst) { 
     if(cst instanceof String) { 
      // capture your string 
     } 
     } 
    }; 
    } 
}, 0); 

visitLdcInsn(..)在JavaDoc。