为了调试,我需要在一个类中跟踪某些代码的执行。我想为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

10-06 14:54