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

在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的源代码,这将是我的调试类的一个function,它不会事先知道源代码)

谢谢。

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

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

另一个选项(略高级)是使用自定义的字节码重写类加载器来保存原始参数,并将它们作为额外参数传递给下一个方法。 这可能需要一两天才能实现。 合适的框架是BCEL或ASM 。

我认为这可能是可能的,因为input超出了范围但仍然无法进行垃圾收集,因此值仍然存在,但不幸的是我不相信有一种默认的API方式来访问它。 对于日志记录方法,可以使用自定义实现的NDC( 嵌套诊断上下文 )来实现这一点。

我不确定你为什么要用Java做这个?

我能想到的唯一方法是为传递的字符串创建一个自定义包装器对象,从而每次都将引用发送给包装器而不是新的字符串。
不过,我建议不要这样做,因为它会破坏你的原始代码,并使它更容易出错。

使用调试器(例如内置于eclipse中的调试器)来检查你的状态可能无法解决这个问题吗?

您可以获取调用方法及其类的名称,但您必须在当前方法中添加一些代码:

  public static void main(String[] args) throws Exception { call(); } private static void call() { Exception exception = new Exception(); for(StackTraceElement trace : exception.getStackTrace()){ System.out.println(trace.getMethodName()); } } 

这将打印“call”和“main”,方法名称按被叫顺序(反向)。

这可以使用Reflection API!

 public class StackTrace { public static void main(String args[]) { StackTrace st = new StackTrace(); st.func(); } public void func() { OtherClass os =new OtherClass(); os.getStackTrace(this); } } class OtherClass { void getStackTrace(Object obj) { System.out.println(obj.getClass()); } } 
Interesting Posts