プログラマメモ2 - programmer no memo2

クラスファイルから文字列をさがす 2014/04/19

javaです。クラスファイルから文字列が定義されているところをみつけて、それが定義されているメソッドを探してみます。

使うのは、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; } }




: