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

时间:2013-08-14 13:03:19

标签: java eclipse class

我正在将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

7 个答案:

答案 0 :(得分:4)

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

但如果它涉及所有可用的方法,你可以使用反射:

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

答案 1 :(得分:3)

要查找从类调用的方法(以编程方式假设),我将使用ASM bytecode analyzing/manipulation library。下面的示例是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);
        }
    }
}

答案 2 :(得分:1)

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

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

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

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

&lt;无耻插头&gt;现在我希望我已经在new Pluralsight Eclipse course.&lt; / Shameless Plug&gt;

中展示了如何做到这一点

Hierarchy window showing all called methods

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

答案取决于背景:

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

如果您希望在运行时执行此操作:这可以通过AspectJ解决,例如参见http://www.eclipse.org/aspectj/doc/released/progguide/language-thisJoinPoint.html(最后有一个部分可以获取任何方法的调用者。)