クラスファイルから文字列をさがす
2014/04/19
asm
java
javaです。クラスファイルから文字列が定義されているところをみつけて、それが定義されているメソッドを探してみます。
使うのは、asmです。
ASM - Home Page
eclipseとかで検索すると、どのクラスのどのメソッドにあるよってみつけてくれるものを実現してみたかったのでした。
使うのは、asmです。
ASM - Home Page
eclipseとかで検索すると、どのクラスのどのメソッドにあるよってみつけてくれるものを実現してみたかったのでした。
package a;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.LdcInsnNode;
import org.objectweb.asm.tree.LocalVariableNode;
import org.objectweb.asm.tree.MethodNode;
public class TestAsmMain {
public static void main(String[] args) throws IOException {
InputStream is = TestAsmMain.class
.getResourceAsStream("/a/TestAsmMain.class");
List<String> list = searchWord(is, "aaa_1234");
System.err.println(list);
}
static List<String> searchWord(InputStream is, String word) {
List<String> list = new ArrayList<String>();
try {
ClassReader reader = new ClassReader(is);
ClassNode classNode = new ClassNode();
reader.accept(classNode, 0);
List<MethodNode> methodList = classNode.methods;
for (MethodNode methodNode : methodList) {
Iterator<AbstractInsnNode> instraIter = methodNode.instructions
.iterator();
while (instraIter.hasNext()) {
AbstractInsnNode abi = instraIter.next();
if (abi instanceof LdcInsnNode) {
// LdcInsnNode であるものから
LdcInsnNode ldcI = (LdcInsnNode) abi;
// System.out.println("LDC node value: " + ldcI.cst);
if (word.equals(ldcI.cst)) {
list.add(methodNode.name);
}
}
}
}
} catch (IOException | SecurityException | IllegalArgumentException e) {
e.printStackTrace();
}
return list;
}
}
: