假设我有一个带有静态方法的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()
如何判断哪个类正在调用它?
答案 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?
}
}