获取调用方法的参数值

时间:2013-05-13 04:20:58

标签: java reflection method-parameters

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

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

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

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

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

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

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

4 个答案:

答案 0 :(得分:0)

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

如果您想知道为mthA传递的参数,请将相同参数传递给mthB,例如:

mthA(1stParam, 2ndParam, ...){
     mthB(1stParam, 2ndParam, ..., OtherParamertsForMthB);          
     ...
}

答案 1 :(得分:0)

获取调用方法的参数值没有简单的方法,(如果你不能改变被调用方法的参数来包含和传递调用参数值)。

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

答案 2 :(得分:0)

如果它仅用于记录目的,那么您应该自己登录mthA所有传递给方法的参数。

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

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

答案 3 :(得分:0)

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