获取调用方法的参数值



如何获取调用方法的参数值?

我有一个场景,其中有两个类,即类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[]传递给您的建议。

相关内容

  • 没有找到相关文章

最新更新