获得方法调用者的机制

时间:2011-09-02 22:47:59

标签: java interop

我的主要问题是如何找出称为特定方法的whitch对象类型。

有没有使用堆栈跟踪的解决方案?

如果不是为什么这些信息不可用?它可能非常有用。

3 个答案:

答案 0 :(得分:2)

  

有没有使用堆栈跟踪的解决方案?

基本上没有。当然,没有良好的解决方案不会在引擎盖下使用异常对象和堆栈跟踪。 (但是,您不需要解析堆栈跟踪文本。您可以获取包含相同信息的StackFrame对象数组。)

理论上,你可以通过传递一个额外的参数来避免使用堆栈跟踪机制来说出调用者是谁。然而,如果您手动执行此操作,这很复杂并且会使代码混乱,如果您尝试自动执行此操作,则会出现问题。

  

如果不是为什么没有这些信息?

由于:

  • 以便宜的方式提供信息会导致普通方法调用因方法调用/返回“协议”的必要更改而变得更加昂贵,

  • 一般来说,方法的行为依赖于所谓的方法是个坏主意,

  • 堆栈跟踪机制无论如何都能完成这项工作,特别是如果您只是为了诊断/跟踪而捕获调用方法。

答案 1 :(得分:1)

抛出异常,捕获它,然后调用异常的getStackTrace()方法,该方法返回StackTraceElement的数组

http://download.oracle.com/javase/1.5.0/docs/api/java/lang/StackTraceElement.html http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Throwable.html#getStackTrace()

答案 2 :(得分:1)

如果方法属于您,则可以在方法中添加一个Object参数,在调用方法时将调用类/对象传递给该参数。

例如:

public class MethodClass
{
    public static void someMethod(int arg1, Object caller)
    {
        // should print "MyCallingClass":
        System.out.println("Calling class is: " + caller.getClass().getName());
    }
}
public class MyCallingClass
{
    public MyCallingClass()
    {
        //...
    }
    public void myCaller()
    {
        MethodClass.someMethod(123, this);
    }
}

修改已将caller中的someMethod参数替换为ClassObject,因此现在应该可以使用。