Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在EclipseIDE中获得从类调用的方法列表?_Java_Eclipse_Class - Fatal编程技术网

Java 如何在EclipseIDE中获得从类调用的方法列表?

Java 如何在EclipseIDE中获得从类调用的方法列表?,java,eclipse,class,Java,Eclipse,Class,我在Java项目中使用EclipseIDE。我需要一个从特定类调用的方法列表,也就是说,我需要看到一个从类调用但未在该类中声明的所有方法的列表。我正在寻找一些可能已经存在于Eclipse中的选项。我不愿意为此编写代码(这将是我最后的选择) 让我用这个例子来解释- public class ABC { public void methodA { System.out.println("In methodA"); BCD bcd = new BCD(); bcd.callMethod

我在Java项目中使用EclipseIDE。我需要一个从特定类调用的方法列表,也就是说,我需要看到一个从类调用但未在该类中声明的所有方法的列表。我正在寻找一些可能已经存在于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

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

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

    Class<?> cls = Class.forName("className");
    Method[] methodList = cls.getMethods();
Class cls=Class.forName(“className”);
方法[]methodList=cls.getMethods();
str+o
列出当前打开的类中可用的所有方法。
这是否回答了您的问题?

如果是在运行时,您可以使用。
动态代理在类的方法调用之前被调用,您可以在某个地方(到另一个类、文件或任何地方)记录调用了哪些方法。

答案取决于上下文:

如果您希望在IDE中为您的代码提供以下内容:这取决于IDE。在月食中,我相信这是不可能的。您可以通过“开放调用层次结构”获得调用给定类(方法的构造函数)的方法


如果您想在运行时执行此操作:这可以通过AspectJ解决,例如,请参见(最后有一个片段可以获取任何方法的调用方)。

要查找从类调用的方法(假设是编程方式),我将使用。下面的示例是一个
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,然后选择OpenCall Hierarchy。然后在call hierarchy(调用层次)窗口中,单击被调用方按钮(参见图中的绿色箭头),并打开所有灰色层次箭头,如下图所示。将显示当前类调用的所有方法的完整列表

现在我希望我已经在我的课堂上展示了如何做到这一点


在Eclipse中,您可以通过在编辑器窗格中选择(突出显示)方法,然后构建调用层次结构(可能是Ctrl-Alt-h)来实现这一点。然后,您可以使用Call Hierarchy窗格右上角的切换按钮从“Show Caller Hierarchy”(默认)切换到“Show Callee Hierarchy”。你想要的那个看起来像一棵侧边的树,右边有孩子,像o-[not]-o

您想知道在运行时其他类调用了类的哪些方法吗?阅读您的问题,不清楚您试图实现什么。。。您正在尝试记录正在调用的方法吗?看看AOP方法。您是否试图实时跟踪特定实例的执行情况?使用调试器。您是否试图(静态地)知道应用程序的其他类正在调用哪些方法,以及在哪一行代码中?查看该特定方法的调用层次结构。问题已编辑。现在说得通吗?不太清楚。。。很明显,您需要一个列出方法依赖项的静态选项。。。您的确切需求是否类似于“给定类
A
列出
A
中调用的其他类的所有方法”?如果是这样,请看:@Anthony Accioly:调用层次结构是相反的方向。获取调用方法。他喜欢得到所谓的方法请看下面我的答案。不过,您可以通过使用CGLIB找到方法何时被调用。虽然我不确定OP是否要求类中的所有方法(无论是声明的还是从超类继承的),或者他是否想知道何时调用一个方法。我只想知道-我从我的类调用的所有方法都是在其他类中声明的。另外,我想通过使用Eclipse中的一些选项来实现这一点,例如,正如我们所看到的大纲,以获取类的所有成员的列表。我假设benny是德国人,使用Eclipse;-)(因为在EclipseCtrl-o中给了你们这个类的概要。谢谢大家,但这不是我想要的:)这很有趣,但仍然不能回答我的问题。让我重新编辑我的问题。是的,我意识到它有两个缺陷,一个是你必须添加一个tramp方法,另一个是它包含来自当前类的方法。后一个问题得到了缓解,因为您可以很容易地看到完整的类名,即右侧的junit.awtui.Logo。我还没有找到解决前一个问题的办法。非常感谢!这正是我所需要的!