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

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

 A级
 {
     static void foo()
     {
         //哪个class叫我?
     }
 }

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

 B级扩展A {}
 C类延伸A {}
 D级延伸A {}
 ...

现在考虑以下方法调用:

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

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

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

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

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

 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 ) { } } 

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

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