如何将参数传递给调用此方法的方法?

2022-09-02 14:14:33

在 Java 中,可以获取调用当前方法(在其中获取 StackTrace 的方法)的类和方法。

是否可以获取传递给调用此方法的方法的参数?

我需要这个用于调试目的。

例如:

baseClass {
   initialFunc(input) {
       var modifiedInput = input + " I modified you";
       otherClass.doSomething(modifiedInput);
   }
}

otherClass {
    doSomething(input)  {
         //GET THE ARGUMENTS PASSED TO THE METHOD OF THE CLASS THAT CALLED THIS METHOD
    }
}

是否可以从堆栈跟踪中获取此信息,或者是否有其他方法?

(请注意,我需要能够在运行时执行此操作,并且实际上无法更改baseClass的源代码,这将是我的调试类的一个功能,事先不知道源代码)


答案 1

我不相信使用标准的Java API是可能的。

您可以做的是使用AspectJ,在调用方法上放置一个切点,保存参数,在被调用的方法上放置一个切点并传递参数。

另一种选择(稍微高级一些)是使用自定义的字节码重写类装入器,该类装入器保存原始参数,并将其作为额外参数传递给下一个方法。这可能需要一两天才能实现。合适的框架是BCELASM


答案 2

我认为这是可能的,因为超出了范围,但还不能用于垃圾回收,所以该值仍然存在,但不幸的是,我不相信有默认的API方法来访问它。这可以通过为日志记录方法自定义实现的 NDC(嵌套诊断上下文)来实现。input