7

I have following classes (note that methods are static):

class Base
{
   public static void whosYourDaddy()
   {
      Class callerClass = // what should I write here to get caller class?
      System.out.print(callerClass.getName());
   }
}

Class A extends Base
{
   public static void foo()
   {
      A.whosYourDaddy();
   }
}

Class B extends Base
{
   public static void bar()
   {
      B.whosYourDaddy();
   }
}

And when I call:

A.foo();
B.bar();

I'd like to get output: AB instead of BaseBase. Is it even possible with static methods (in Java 7)?

4

3 回答 3

6

您可以做但不应该做的事情:) 是使用 Throwable getStackTrace 方法。除了气味之外,这很慢,因为获取堆栈跟踪并不是那么快。但是你会得到一个 StackTraceElement 数组,每个数组都包含调用它的类的类(你也可以得到文件和行,如果你用 : 将两者分开,你可以获得一个可点击的链接日食,并不是说我会做这样的事情......)。

就像是

String className = new Throwable().getStackTrace()[1].getClassName(); 

希望有帮助:)

于 2013-09-05T23:49:12.287 回答
0

私有静态类反射{
    私有静态最终安全管理器实例=新安全管理器();
    静态类 getCallClass() {
        返回 INSTANCE.getCallClass(2);
    }
    私人反射(){
    }
    私有静态类 SecurityManager 扩展 java.lang.SecurityManager {
        公共类 getCallClass(int i) {
            类[] classContext = getClassContext();
            if (i >= 0 && i + 1 < classContext.length) {
                返回类上下文[i + 1];
            }
        返回空值;
        }
    };
}

于 2014-01-01T14:00:50.180 回答
-1

甚至可以使用静态方法(在 Java 7 中)?

不,静态方法不会被继承。仅继承非静态方法。

在您的情况下,更改Base(和子类)如下:

class Base
{
  public void whosYourDaddy()
  {
    Class<?> callerClass = getClass();
    System.out.print(callerClass.getName());
  }
}
于 2013-09-05T23:43:57.420 回答