我正在将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
答案 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;
中展示了如何做到这一点。
答案 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(最后有一个部分可以获取任何方法的调用者。)