哪个类调用了我的静态方法?

时间:2008-11-12 03:57:28

标签: java reflection

假设我有一个带有静态方法的Java类,如下所示:

class A
{
    static void foo()
    {
        // Which class invoked me?
    }
}

进一步假设A类具有任意数量的子类:

class B extends A { }
class C extends A { }
class D extends A { }
...

现在考虑以下方法调用:

A.foo();
B.foo();
C.foo();
D.foo();
...

我的问题是,方法foo()如何判断哪个类正在调用它?

3 个答案:

答案 0 :(得分:10)

它不能,这是静态方法问题的一部分。就编译器而言A.foo()B.foo()完全相同。实际上,它们编译为相同的字节码。你无法获得更多类似的东西。

如果您确实需要此类信息,请使用单例并将foo()转换为实例方法。如果您仍然喜欢静态语法,则可以构建一个外观A.foo()

答案 1 :(得分:4)

虽然你无法找到上调用静态方法的类,但是可以在运行时找出实际调用方法的类:

static void foo()
{
   Throwable t = new Throwable();
   StackTraceElement[] trace = t.getStackTrace();
   String className = trace[1].getClassName();
   Class whoCalledMe = null;
   try
   {
      whoCalledMe = Class.forName( className );
   }
   catch( Exception e )
   {
   }
}

我不是说这是一种好的做法,从性能的角度来看也许并不好,但它应该有效。不知道这对你有什么帮助......

答案 2 :(得分:3)

class A
{
    static void foo(A whoIsCalingMe)
    {
        // Which class invoked me?
    }
}