Как получить список методов, определенных в другом классе, вызванном из данного метода в Java - PullRequest
5 голосов
/ 12 июня 2019

Я планирую получить список методов, определенных в одном пакете (CommonPackage), вызываемых классом, определенным в другом пакете (ServicePackage).Для этого мне нужно отсканировать данный код метода и получить методы, вызываемые вне этого класса.

Я исследовал отражения Java и не смог найти никакого решения для этого.Я также прошел через Как получить список методов, вызванных из метода, использующего отражение в C # , и не смог найти какого-либо окончательного решения специально для JAVA.

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

ClassB {

    public methodB1(){
      // Some code
    }
}

Ожидается: дляClassA.MethodA1, мы получаем список методов, вызываемых внутри него.Выход: ClassB.MethodB1

Ответы [ 2 ]

4 голосов
/ 12 июня 2019

Reflection API обеспечивает видимость структуры класса: его методов и полей. Однако это не позволяет изучать методы.

Вам нужно проанализировать байт-код, сгенерированный компилятором, и извлечь из него интересную информацию. Есть ряд библиотек, которые делают это, например, Apache BCEL . Вы можете посмотреть на аналогичный вопрос и соответствующий ответ в SO .

2 голосов
/ 17 июня 2019

Я использовал манипулятор с байт-кодом с открытым исходным кодом под названием Javassists , у которого уже есть API для извлечения вызовов методов, сделанных в данном методе.Он также имеет метод для получения атрибута кода, который может дать вам количество строк в данном методе.

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);
           }
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...