哪个类调用了我的静态方法?
假设我有一个带有静态方法的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? } }