【问题标题】:Accessing Java Stack Frame访问 Java 堆栈帧
【发布时间】:2012-10-26 16:01:14
【问题描述】:

是否可以通过堆栈框架访问方法参数?

由于我一直在从事的一个项目,我遇到了这种需求。如果发生异常,我想做一些日志记录。如果可能的话,我想递归地记录一个方法的名称和参数,直到我到达“上层”。

这是一个小例子:

class Parent{

    public int parentMethod(int param1) {
        String param2;
        Child child = new Child();
        (...)some Work(...)
        int ret = child.childMethod(param1, param2);
        (...)some More Work(...)
        return ret;
    }
}


class Child{
    public int childMethod(int param1, String param2) {
        (...) do more stuff (...)
        try {
            (...) this might generate an exception(...)
        }catch(Exception e) {
            (...) log method name and parameters value(...)
        }
    }
}

所以在这种情况下,我想记录以下内容: -childMethod:param1 值,param2 值- -parentMethod: param1 值-

【问题讨论】:

  • 如果孩子“做更多的事情”会怎样param1++
  • 相关的,也许是重复的:stackoverflow.com/questions/4943612/…
  • @leonbloy - 重要吗?这是一个原始的,并按值复制
  • 当然,我的意思是,在他想要记录传递的 param1 值的那一刻,它将在此范围内不可用(可能在任何范围内)。如果要记录这些值,则需要在函数调用开始时存储所有参数的副本。
  • 如果一个参数被改变了,在改变之后记录它的值是没有问题的。我更关注递归问题中的实际日志记录,它不会在每个异常可能性中进行特定的尝试捕获。处理它们的通用方法,记录当前方法参数及其值,以及方法名称。

标签: java logging parameters stack


【解决方案1】:

我认为你有一个根本问题。对于除了原语以外的任何东西,参数 references 都会被传递。因此,方法可以更改传递给它的参数值。简单的堆栈遍历并不能解决这个问题。

我注意到您上面的示例使用了原语和不可变对象。但是我怀疑你需要一个更通用的解决方案。也许某种 AOP 解决方案可能会起作用,但您仍然必须在调用方法时复制对象(以便记录它们),我预见到世界将是悲惨的。

【讨论】:

  • 我使用了原语和一个对象,因为我需要一个通用的解决方案来处理几乎任何类型的对象。我不需要它是“可读和可理解的”。例如,在对象中,如果我记录 param1 后跟 param1.toString() 则没有问题。
  • 我认为您的问题不在于“可读性和可理解性”。我认为这与“正确且切实可行”有关。
  • 是的,你说的很对。但是如果更改参数值没有问题,我只需记录更改的值。问题是实际的日志记录,是否可以按照我的建议进行。
猜你喜欢
  • 1970-01-01
  • 2013-05-17
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
  • 1970-01-01
  • 2016-01-12
  • 2015-11-07
相关资源
最近更新 更多