从继承的静态方法获取调用者类名

时间:2013-09-05 23:36:49

标签: java reflection 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();
   }
}

当我打电话时:

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

我想获得输出: AB代替BaseBase。甚至可以使用静态方法(在Java 7中)?

3 个答案:

答案 0 :(得分:6)

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

这样的东西
String className = new Throwable().getStackTrace()[1].getClassName(); 

希望有所帮助:)

答案 1 :(得分:0)

 private static class Reflection {
    private static final SecurityManager INSTANCE = new SecurityManager();
    static Class getCallClass() {
        return INSTANCE.getCallClass(2);
    }
    private Reflection() {
    }
    private static class SecurityManager extends java.lang.SecurityManager {
        public Class getCallClass(int i) {
            Class[] classContext = getClassContext();
            if (i >= 0 && i + 1 < classContext.length) {
                return classContext[i + 1];
            }
        return null;
        }
    };
}

答案 2 :(得分:-1)

是否可以使用静态方法(在Java 7中)?

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

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

class Base
{
  public void whosYourDaddy()
  {
    Class<?> callerClass = getClass();
    System.out.print(callerClass.getName());
  }
}