如何获取调用方法的参数值?
我有一个场景,其中有两个类,即类A和类B,包含两个方法mthA(在类A中(和mthB(在类B中(。mthA调用mthB。现在我想知道在mthB中,所有的参数都传递给了mthA。这主要用于记录和处理异常。我可以得到调用类的类名,即class A和调用mthB的方法名,即mthA。但我一直在获取mthA的参数。
Thread.currentThread().getStackTrace()[1].getClassName()
这给了我调用方法的类名,即class A.
Thread.currentThread().getStackTrace()[2].getMethodName()
这给了我调用方法的方法名,即mthA。
如果我能以某种方式获得整个方法本身,那么我就可以通过使用getParameters((获得传递给这个方法的方法参数。
获取调用方法的参数值没有简单的方法(如果不能更改被调用方法的值以包含并传递调用参数值(。
使用Thread提供的一些API,我们可以获得类/方法名称等静态信息,但不能获得参数值等运行时信息。一种方法可以是在某个地方存储和管理此类信息,并在日志记录/异常时显示。我不认为在java中有API。
有一种最简单的方法,或者有必要使用反射。。?
若你们想知道传递给mthA
的参数是什么,那个么把同样的参数也传给mthB
,例如:
mthA(1stParam, 2ndParam, ...){
mthB(1stParam, 2ndParam, ..., OtherParamertsForMthB);
...
}
如果它只是用于日志记录,那么您应该将传递到方法中的所有参数都登录到mthA
本身中。
为什么mthB
应该知道mthA
的参数值来处理异常?如果您正在这样做,那么您应该考虑重构代码,并在适当的级别处理异常。如果传递给mthA
的值导致异常,那么在调用mthB
之前,应该在那里自行处理。
反射只帮助获取类和方法的静态信息,而不提供传递到方法中的参数的运行时值。
为什么不使用像AspectJ这样的AOP工具来捕获这些值并进行日志记录?您可以使用execution((切入点和after((建议。对于非生产部署,您可以记录所有方法调用以及传递的值和返回的值。对于生产环境来说,这将是太多的开销。为此,您可以将传递的值(在AspectJ建议中获得的Object args[](存储在本地变量中,并仅在出现异常时记录它。但即使在这种情况下,也会有一些性能损失,因为基元值将被装箱,作为Object[]传递给您的建议。