我需要編寫一個工具,列出調用指定接口的方法的類。它將用作包含許多模塊的大型Java應用程序的構建過程的一部分。目標是自動記錄某些java模塊之間的依賴關係。ASM方法訪問者是否可以與接口一起使用?
我發現了一些用於依賴關係分析的工具,但它們不能在方法級別上工作,只能用於包或罐子。最後我發現ASM,這似乎是我所需要的。
以下代碼打印所有的類文件中的給定目錄中的方法依賴關係:
import java.io.*;
import java.util.*;
import org.objectweb.asm.ClassReader;
public class Test {
public static void main(String[] args) throws Exception {
File dir = new File(args[0]);
List<File> classFiles = new LinkedList<File>();
findClassFiles(classFiles, dir);
for (File classFile : classFiles) {
InputStream input = new FileInputStream(classFile);
new ClassReader(input).accept(new MyClassVisitor(), 0);
input.close();
}
}
private static void findClassFiles(List<File> list, File dir) {
for (File file : dir.listFiles()) {
if (file.isDirectory()) {
findClassFiles(list, file);
} else if (file.getName().endsWith(".class")) {
list.add(file);
}
}
}
}
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.commons.EmptyVisitor;
public class MyClassVisitor extends EmptyVisitor {
private String className;
@Override
public void visit(int version, int access, String name, String signature,
String superName, String[] interfaces) {
this.className = name;
}
@Override
public MethodVisitor visitMethod(int access, String name, String desc,
String signature, String[] exceptions) {
System.out.println(className + "." + name);
return new MyMethodVisitor();
}
}
import org.objectweb.asm.commons.EmptyVisitor;
public class MyMethodVisitor extends EmptyVisitor {
@Override
public void visitMethodInsn(int opcode, String owner, String name,
String desc) {
String key = owner + "." + name;
System.out.println(" " + key);
}
}
問題:
該代碼僅適用於普通類!如果類文件包含一個接口,則調用visitMethod,但不會調用visitMethodInsn。我沒有得到關於接口方法調用者的任何信息。
任何想法?
我不認爲在這種情況下有一個方法體是相關的。因爲調用了* visitMethod()*並返回了一個新的* MyMethodVisitor *實例,所以訪問該接口方法,但此* MyMethodVisitor *之後似乎被忽略。 我從磁盤讀取類,因爲我需要分析一個沒有運行的應用程序。 – 2010-05-20 09:02:31