Я планирую получить список методов, определенных в одном пакете (CommonPackage), вызываемых классом, определенным в другом пакете (ServicePackage). Для этого мне нужно просканировать данный код метода и получить методы, вызываемые вне этого класса.
Я исследовал отражения Java и не смог найти никакого решения для этого. Я также прошел Как получить список методов, вызываемых из метода, используя отражение в С# и не смог найти окончательного решения конкретно для JAVA.
ClassA {
private ClassB classB;
public methodA1(){
classB.methodB1();
}
}
ClassB {
public methodB1(){
// Some code
}
}
Ожидается: для ClassA.MethodA1 мы получаем список методов, вызываемых внутри него. Выход: ClassB.MethodB1
@StephanHogenboom Просто имя метода из другого класса.
Хорошо, печатать имена методов другого класса не так сложно
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);
}
});
}
Вы хотите напечатать имя метода (ов) из другого класса? Или код внутри метода?