我需要编写一个工具,列出调用指定接口方法的类。它将用作由许多模块组成的大型 Java 应用程序的构建过程的一部分。目标是自动记录某些 java 模块之间的依赖关系。
我发现了几个用于依赖分析的工具,但它们不适用于方法级别,仅适用于包或 jar。最后我找到了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。我没有得到有关接口方法调用者的任何信息。
有任何想法吗?