Estou planejando para obter a lista de métodos definidos em um pacote (CommonPackage) chamados por uma classe definida em outro pacote (ServicePackage). Para isso, eu preciso de um para rastrear um determinado código de método e obter os métodos chamados fora desta classe.
Eu pesquisei as reflexões Java e não foi capaz de encontrar alguma solução para isso. I também passou por Como obter a lista de métodos chamados a partir de um método usando reflexão em C # e não foi capaz de encontrar qualquer solução conclusiva para JAVA especificamente.
ClassA {
private ClassB classB;
public methodA1(){
classB.methodB1();
}
}
ClassB {
public methodB1(){
// Some code
}
}
Esperado: Para ClassA.MethodA1, obtemos a lista de métodos chamados dentro dela. Saída: ClassB.MethodB1
Eu usei um manipulador de código-fonte aberto chamado byte Javassists que já tem uma API para buscar chamadas de método feitas em um determinado método. Ele também tem método para buscar o atributo de código que pode lhe dar a nenhuma das linhas em um determinado método.
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);
}
});
}