Я хочу распечатать вызовы методов Java с именами и значениями параметров и вернуть результаты.Является ли Antlr правильным инструментом для отслеживания вызовов методов Java с именами и значениями параметров и результата возврата?
Я не хочу вручную добавлять инструкции трассировки, особенно когда код находится в сторонней библиотеке. Мне нужно понять взаимодействие с библиотекой, особенно когда используются обратные вызовы.
Я попытался использовать обертку, но столкнулся с проблемами, поэтому подкласс лучше. (т. е. вызовы wrappedObject.methodA() или super.methodA())
Это боль, чтобы написать этот код, особенно когда есть много методов.
Я хочу, чтобы Java могла делать это автоматически, так как в нем есть все, чтобы сделать это возможным.
Каков наилучший способ для этого? Подстановка объектов с помощью оболочки или подкласса является компромиссом.
Итак, следующим шагом является добавление кода трассировки в оболочку или подкласс. Я думал написать парсер для генерации кода.
Я использовал yacc & lex before, и только что узнал о Antlr.
Является ли Antlr правильным инструментом для этого? Как мне это сделать? Раньше я не использовал Antlr, но видел его.
Спасибо.
Вот что я хочу сделать -
// 3rdParty library under investigation, with evolving versions
import com.3rdParty.lib.Service;
import com.3rdParty.lib.Callback;
MyExistingClass {
Service service = new Service();
// Need to understand 3rd party library service and callback interactions
// Also need to write my own callbacks using 3rd party interface
if (traceMethod1) {
service.doSomething(param1, new CallbackWrapper(), param3);
}
else if (traceMethod2) {
service.doSomething(param1, new CallbackSubclass(), param3);
}
else {
// Original code
// Service calls Callback methods
service.doSomething(param1, new Callback(), param3);
}
}
--------------------------------------------------------------------------------
// 3rd Party code - Service calls Callback methods
package com.3rdParty.lib;
public Callback extends SomeBaseClass {
public void methodA(int code, String action, SomeClass data) {
// do method A stuff
}
public String methodB(String name, boolean flag) {
// do method B stuff
return result;
}
...etc.
}
--------------------------------------------------------------------------------
// Wrapper class - traceMethod1
package com.my.package;
import com.3rdParty.lib.Callback;
public CallbackWrapper implements SomeCallbackInterface {
Callback cb = new Callback();
public void methodA(int code, String action, SomeClass data) {
logger.debug("CallbackWrapper.methodA() called");
logger.debug(" code = " + code);
logger.debug(" action = " + action);
logger.debug(" data = " + data);
cb.methodA(code, action, data);
logger.debug("CallbackWrapper.methodA() returns");
}
public String methodB(String name, boolean flag) {
logger.debug("CallbackWrapper.methodB() called");
logger.debug(" name = " + name);
logger.debug(" flag = " + flag);
String result = cb.methodB(name, flag);
logger.debug("CallbackWrapper.methodB() returns result = " + result);
return result;
}
...etc.
}
--------------------------------------------------------------------------------
// Subclass - traceMethod2
package com.my.package;
import com.3rdParty.lib.Callback;
public CallbackSubclass extends Callback {
public void methodA(int code, String action, SomeClass data) {
logger.debug("CallbackSubclass.methodA() called");
logger.debug(" code = " + code);
logger.debug(" action = " + action);
logger.debug(" data = " + data);
super.methodA(code, action, data);
logger.debug("CallbackSubclass.methodA() returns");
}
public String methodB(String name, boolean flag) {
logger.debug("CallbackSubclass.methodB() called");
logger.debug(" name = " + name);
logger.debug(" flag = " + flag);
String result = super.methodB(name, flag);
logger.debug("CallbackSubclass.methodB() returns result = " + result);
return result;
}
...etc.
}
Я не совсем понимаю, что вы хотите сделать, но это больше похоже на работу для аспектно-ориентированного программирования (например, используйте [Spring AOP] (http://docs.spring.io/spring/docs/ current/spring-framework-reference/html/aop.html) или [AspectJ] (https://eclipse.org/aspectj/)), чем то, для чего вам нужен синтаксический анализатор. – Jesper
Спасибо. Только что отредактировал оригинальный пост с примером кода, чтобы проиллюстрировать вопрос. – alteh