В этом же пакете есть two classes A and B
.Получите имя функций, вызываемых классом
как получить имя функции класса А называется классом В.
Ограничением является то, что код A и B не может быть изменен.
В этом же пакете есть two classes A and B
.Получите имя функций, вызываемых классом
как получить имя функции класса А называется классом В.
Ограничением является то, что код A и B не может быть изменен.
Отражение может быть очень полезным, но очень сложным, если вы его не понимаете.
Если у вас есть имя класса, и хотите напечатать методы:
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 не предоставляет никакого способа для этого.
The API, как всегда, предоставляет дополнительную информацию. Если вы посмотрите там, вы можете придумать простую работу.
«Класс всех функций, называемых классом 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();
}
}
Вы не можете использовать отражение Java для выполнения задач статического анализа кода, подобных этому. API-интерфейсы отражения не предоставляют необходимую информацию.
Off верхней части моей головы, я могу думать о двух подходов, которые будут работать:
Если у вас есть только файлы «.class», то вы можете использовать библиотеку байткодом такие как BCEL к загружать классы и пересекать их, чтобы идентифицировать все вызовы методов.
Если у вас есть исходный код, вы также можете использовать некоторую существующую библиотеку парсеров Java для создания АСТ для вашего кода и анализа их.
(Первый подход, вероятно, проще, если все, что вы хотите, это список имен классов и методов.)
Dependency Finder могут делать запросы для этого. Его подход состоит в том, чтобы генерировать метаданные в XML, а затем использовать сравнение на основе regexp. Возможно, вы специально ищете функцию, называемую «закрытие» с помощью ссылки на вход.
Непонятно, что задается вопросом, пожалуйста, обновите свой вопрос, чтобы сделать то, что вы пытаетесь сделать более понятным. Также, пожалуйста, отправьте код того, что вы пробовали. –
Вы хотите сделать это во время выполнения? По статическому анализу? С тем, что вы опубликовали до сих пор, это не вопрос по стандартам SO. –
@JimGarrison Я хочу сделать это путем статического анализа. – Saurabh