如何从Eclipse IDE中获取从类调用的方法列表?

我正在将Eclipse IDE用于我的Java项目。 我需要一个从特定类调用的方法列表,即我需要查看从类调用但未在其中声明的所有方法的列表。 我正在寻找可能已经存在于Eclipse中的一些选项。 我不愿意为此编写代码(这将是我的最后选择)。

让我用这个例子解释一下 –

public class ABC { public void methodA { System.out.println("In methodA"); BCD bcd = new BCD(); bcd.callMethodAA(); // defined in class BCD } public void methodB { System.out.println("In methodB"); CDE cde = new CDE(); cde.callMethodBB(); // defined in class CDE } } 

我想要一个选项,它会告诉我 – 从我们正在调用的ABC类 – a)callMethodAA b)callMethodBB

如果您只需要列出正在使用的方法,则没有语言方法可以实现。 虽然可能有一些覆盖工具可以处理这个问题。

但如果它关于所有可用的方法,你可以使用reflection:

  Class cls = Class.forName("className"); Method[] methodList = cls.getMethods(); 

要查找从类调用的方法(以编程方式假设),我将使用ASM字节码分析/操作库 。 下面的示例是一个ClassVisitor ,它打印从类调用的所有方法。

 import org.objectweb.asm.ClassAdapter; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.commons.InstructionAdapter; public class MethodCallFinder extends ClassAdapter { private String name; public MethodCallFinder(ClassVisitor classVisitor) { super(classVisitor); } @Override public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { this.name = name; super.visit(version, access, name, signature, superName, interfaces); } @Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { return new MethodCallPrinter(super.visitMethod(access, name, desc, signature, exceptions)); } private class MethodCallPrinter extends InstructionAdapter { public MethodCallPrinter(MethodVisitor methodVisitor) { super(methodVisitor); } @Override public void visitMethodInsn(int opcode, String owner, String name, String desc) { System.out.printf("Class %s calls method %s with descriptor %s from class %s%n", MethodCallFinder.this.name, name, desc, owner); super.visitMethodInsn(opcode, owner, name, desc); } } } 

您可以通过创建一个调用类中所有方法的方法来实现。 如果你已经有一个更好的。 以Junit的Logo.java类为例,如果我创建它:

 private void ExposeAllCalledMethods() { Logo x = new Logo(); x.loadImage("something"); Graphics g; x.paint(g); } 

注意我不需要调用paintBackround()因为paint()已经调用它。

然后我可以右键单击方法名称ExposeAllCalledMethods并选择Open Call Hierarchy 。 然后在调用层次结构窗口中单击“被调用者”按钮(请参见图像中的绿色箭头)并打开所有灰色层次结构箭头,如下图所示。 显示当前类调用的所有方法的完整列表。

现在我希望我已经在我的新Pluralsight Eclipse课程中展示了如何做到这一点。

显示所有被调用方法的层次结构窗口

在Eclipse中,您可以通过在编辑器窗格中选择(突出显示)方法,然后构建调用层次结构(可能是Ctrl-Alt-h)来完成此操作。 然后,您可以使用“调用层次结构”窗格右上角的切换按钮从“显示调用者层次结构”(默认)切换到“显示调用者层次结构”。 你想要的那个看起来像是右边有孩子的侧身树,就像o- [not] -o。

str + o列出了当前打开的类中可用的所有方法。 这回答了你的问题了吗?

如果它在运行时,您可以使用动态代理 。 动态代理在类的方法调用之前调用,您可以在某处(另一个类,或文件或其他)记录已调用的方法。

答案取决于上下文:

如果您希望在IDE中使用此代码:这取决于IDE。 在Eclipse中,我相信,这是不可能的。 您可以通过“Open Call Hierarchy”获取调用给定类(方法的构造函数)的方法。

如果你喜欢在运行时这样做:这可以用AspectJ解决,参见http://www.eclipse.org/aspectj/doc/released/progguide/language-thisJoinPoint.html (最后有一篇文章可以解决得到任何方法的调用者)。