Java 如何在EclipseIDE中获得从类调用的方法列表?
我在Java项目中使用EclipseIDE。我需要一个从特定类调用的方法列表,也就是说,我需要看到一个从类调用但未在该类中声明的所有方法的列表。我正在寻找一些可能已经存在于Eclipse中的选项。我不愿意为此编写代码(这将是我最后的选择) 让我用这个例子来解释-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
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。我还没有找到解决前一个问题的办法。非常感谢!这正是我所需要的!