Как получить список методов, определенных в другом классе, вызываемом из данного метода в Java

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

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

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

ClassB {

    public methodB1(){
      // Some code
    }
}

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

Вы хотите напечатать имя метода (ов) из другого класса? Или код внутри метода?

Stephan Hogenboom 12.06.2019 11:01

@StephanHogenboom Просто имя метода из другого класса.

harshit modani 12.06.2019 11:42

Хорошо, печатать имена методов другого класса не так сложно

Stephan Hogenboom 12.06.2019 12:03
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
3
216
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

Ответ принят как подходящий

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

Другие вопросы по теме