如何获取调用方法的参数值?
我的场景有两个类,即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()获取传递给此方法的方法参数。
答案 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 []传递给您的建议。