Получить имя функции, вызываемой классом - PullRequest
0 голосов
/ 07 марта 2012

В том же пакете two classes A and B.

как получить имя функций класса A, вызываемых классом B.

Ограничение состоит в том, что код Aи B не может быть изменено .

Ответы [ 4 ]

3 голосов
/ 07 марта 2012

Нельзя использовать отражение Java для выполнения задач статического анализа кода, подобных этой.API-интерфейсы отражения не предоставляют необходимую информацию.

Вдобавок ко всему, я могу вспомнить два подхода, которые будут работать:

  • Если вытолько файлы ".class", тогда вы можете использовать библиотеку байт-кода, такую ​​как BCEL, чтобы загрузить классы и пройти их, чтобы идентифицировать все вызовы метода.

  • Если у вас есть источниккода, вы также можете использовать некоторую существующую библиотеку синтаксического анализатора Java для создания AST для вашего кода и их анализа.

(Первый подход, вероятно, проще, если все, что вам нужно, это список классов иимена методов.)

1 голос
/ 07 марта 2012

«Класс всех функций, вызываемых классом A или классом B», сбивает с толку.Но, если вы хотите получить класс и имя функции вызывающей стороны для метода detectsName, описанного в вашем классе A, тогда вам будет полезен следующий код.

public class A {
    public void detectsName() {
        Throwable t = new Throwable();
        StackTraceElement traceLine = t.getStackTrace()[1];
        // t.printStackTrace();
        String className = traceLine.getClassName();
        String methodName = traceLine.getMethodName();
        int lineNumber = traceLine.getLineNumber();
        System.out.println(className);
        System.out.println(methodName);
        System.out.println(lineNumber);
    }
}

Если вы вызываете этометод из любого другого класса скажет - B, он будет обнаружен.

public class B {
    public static void main(String[] args) {
        A a = new A();
        a.detectsName();
    }
}
1 голос
/ 07 марта 2012

Отражение может быть очень полезным, но очень сложным, если вы его не понимаете.

Если у вас есть имя класса и вы хотите напечатать методы:

Class c = Class.forName(the_class_name);

for(Method m : c.getMethods()) {
  System.out.println(m.toString());
}

Если вы хотите, чтобы имя класса было задано для любого объекта:

String className = the_object.getClass().getName();

Комбинация двух может выглядеть следующим образом:

for(Method m : the_object.getClass().getMethods())
  System.out.println(m.toString());

Я думаю, что вы запрашиваете имена всех методов из A, которые B вызывает.

Это не может быть сделано с помощью рефлексии, в основном потому, что Java не предоставляет никакого метода для этого.

API , как всегда, предоставляет больше информации. Если вы посмотрите там, вы можете придумать простую работу.

0 голосов
/ 07 марта 2012

Поиск зависимостей может выполнять запросы для этого.Его подход заключается в том, чтобы генерировать метаданные в XML, а затем использовать сравнение на основе регулярных выражений.Вы можете специально искать функцию под названием «закрытие» с входящей ссылкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...