如何获取从Java中的给定方法调用的另一个类中定义的方法列表

时间:2019-06-12 08:41:04

标签: java reflection dependency-management

我打算获取在一个程序包(CommonPackage)中定义的方法的列表,该方法由另一个程序包(ServicePackage)中定义的类调用。为此,我需要检索给定的方法代码并获取在此类之外调用的方法。

我已经研究了Java反射,但是没有找到任何解决方案。我还经历了How to get the list of methods called from a method using reflection in C#,但没有找到专门针对JAVA的任何最终解决方案。

ClassA {
    private ClassB classB;
    public methodA1(){
        classB.methodB1();
    }
}

ClassB {

    public methodB1(){
      // Some code
    }
}

预期:对于ClassA.MethodA1,我们获得其中调用的方法的列表。输出:ClassB.MethodB1

2 个答案:

答案 0 :(得分:4)

Reflection API提供了类结构的可见性:其方法和字段。但是,它不允许研究方法。

您需要的是解析由编译器生成的字节码,并从那里提取有趣的信息。有许多这样做的库,例如Apache BCEL。您可以在SO中查看类似的问题和相关的答案。

答案 1 :(得分:2)

我使用了一个名为Javassists的开源字节码操纵器,该操纵器已经具有API来提取在给定方法中进行的方法调用。它还具有获取code属性的方法,该属性可以给定给定方法中的行数。

import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.NotFoundException;
import javassist.expr.ExprEditor;
import javassist.expr.MethodCall;
public static void main(String[] args)
{
    ClassPool cp = ClassPool.getDefault();
    CtClass ctClass = null;
    try {
        ctClass = cp.get(className);
    } catch (NotFoundException e) {
        throw new RuntimeException(e);
    }

    CtMethod ctMethod = ctClass.getMethod(methodName);

    ctMethod.instrument( 
           new ExprEditor() {
               public void edit(MethodCall calledMethod) {
                   System.out.println("Method "+ calledMethod.getMethod().getName() + " is called inside "+methodName);
           }
    });
}