为了调试,我需要在一个类中跟踪某些代码的执行。我想为XML中的所有方法调用生成日志,例如:
<call class='pack.age.MyClass' method='myMethod1'>
<param name='param1'>param1.toString() value</param>
...
<call>Call to other method within myMethod1; you get the idea</call>
</call>
因为该类很长并且有很多方法,所以我想知道是否有一种方法可以通用地访问参数,也许使用反射。我在方法内部,我想循环调用此方法的参数。这会减轻我的痛苦,并允许我进行正则表达式来添加日志行。可能吗 ?
任何其他巧妙的方式都可以实现(但AOP并不是真正的选择)。
最佳答案
另一种方法是使用动态跟踪器,例如BTrace(类似于AOP,但在代码之外)。请查看BTrace's wiki作为示例。甚至还可以将VisualVM插件附加到正在运行的进程,从而使事情变得更容易。通过以下BTrace代码,您可以获得方法调用及其参数(摘自示例)。
import com.sun.btrace.AnyType;
import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;
@BTrace public class YourCalls {
@OnMethod(clazz="pack.age.MyClass", method="myMethod1",
location=@Location(value=Kind.CALL, clazz="/.*/", method="/.*/"))
public static void o(AnyType[] args) { // all calls to methods
printArray(args);
}
}
将BTrace附加到正在运行的程序很容易。在此调用之后,首先使用jps获取您的进程的PID:
btrace PID YourCalls.java