从静态方法知道调用者对象或线程

时间:2013-07-14 14:21:54

标签: java multithreading object static

我有一个类的静态方法,它是从一个对象或线程的另一个非静态方法调用的 有没有办法知道它被调用的是哪个线程或对象? 我认为这是不可能的,我什么都不需要,但只想确认一下。

我的意思是这样的

class CallerID
{
    public static void main(String ...s)
    {
        CallerID ob=new CallerID();
        ob.caller();
    }
    void caller()
    {
        showCaller();
        System.out.println("In this method, ob = "+this);
    }
    static void showCaller()
    {
        //code to get caller object ob like it is printed in method caller()
    }
}

5 个答案:

答案 0 :(得分:1)

实际上,您可以打印堆栈跟踪以了解它所调用的线程和对象。

答案 1 :(得分:1)

您可以使用

StackTraceElement[] el = Thread.currentThread().getStackTrace();

查看回溯,从中可以找到那里的来电者。

答案 2 :(得分:1)

可以使用Thread.currentThread()找到该主题。 调用对象虽然无法找到。可以通过解析堆栈跟踪找到调用方法,尽管这可能非常慢。

答案 3 :(得分:1)

你无法获得对象调用。您可以获取调用对象,线程和方法,但是如果您想要引用,则必须将this作为参数传递。

答案 4 :(得分:1)

您可以查看线程的最新堆栈跟踪,通常是第四个条目,或者您可以迭代检查:

 StackTraceElement[] trace = Thread.currentThread().getStackTrace();
 if(trace.length > 3){
   System.out.println("Called from method " + trace[3].getMethodName() + " of class " + trace[3].getClassName());
 }