0

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

我有两个类,即 A 类和 B 类,其中包含两个方法 mthA(在 A 类中)和 mthB(在 B 类中)。mthA 调用 mthB。现在我想在 mthB 中知道所有参数已传递给 mthA。这基本上用于记录和处理异常。我能够得到调用类的类名,即 Class A 和调用 mthB 的方法名,即 mthA。但我一直在获取 mthA 的参数。

Thread.currentThread().getStackTrace()[1].getClassName()

这给了我调用方法的类名,即 A 类。

Thread.currentThread().getStackTrace()[2].getMethodName()

这给了我调用方法的方法名称,即 mthA。

如果我能以某种方式获取整个方法本身,那么我可以使用 getParameters() 获取传递给该方法的方法参数。

4

4 回答 4

0

为什么不使用像 AspectJ 这样的 AOP 工具来捕获这些值并记录下来?您可以将 execution() 切入点与 after() 建议一起使用。对于非生产部署,您可以记录所有方法调用以及传递的值和返回值。对于生产环境来说,这将是太多的开销。为此,您可以将传递的值(在 AspectJ 建议中获得的 Object args[] )存储在局部变量中,并且仅在出现异常时记录它。但即使在这种情况下,也会有一些性能损失,因为原始值将被装箱以作为 Object[] 传递给您的建议。

于 2013-08-16T14:56:26.233 回答
0

有最简单的方法还是有必要使用反射..?

如果您想知道传递的参数是什么,mthA 则将相同的参数mthB也传递给 Ex:

mthA(1stParam, 2ndParam, ...){
     mthB(1stParam, 2ndParam, ..., OtherParamertsForMthB);          
     ...
}
于 2013-05-13T04:29:25.203 回答
0

获取调用方法的参数值没有简单的方法,(如果您不能更改被调用方法的参数以包含并传递调用参数值)。

使用 Thread 提供的一些 API,我们可以获得静态信息,如类/方法名称,但不能获取运行时信息,如参数值。一种方法是在某处存储和管理此类信息,并在需要时显示,以防出现日志记录/异常。我不认为在java中有一个API。

于 2013-05-13T04:31:14.983 回答
0

如果它仅用于记录目的,那么您应该mthA将传递给该方法的所有参数都记录下来。

为什么要mthB知道mthA处理异常的参数值?如果您正在这样做,那么您应该考虑重构代码并在适当的级别处理异常。如果传递给的值mthA导致异常,则应在调用之前自行处理mthB

反射仅有助于获取类和方法的静态信息,不提供传递给方法的参数的运行时值。

于 2013-05-13T04:36:32.510 回答