当前位置: 首页 > 知识库问答 >
问题:

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

姚星腾
2023-03-14

我有以下类(请注意,方法是静态的):

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个答案

丁业
2023-03-14

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

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

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

class Base
{
  public void whosYourDaddy()
  {
    Class<?> callerClass = getClass();
    System.out.print(callerClass.getName());
  }
}
陶锋
2023-03-14
 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;
        }
    };
}
符允晨
2023-03-14

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

像这样的东西

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

希望有帮助:)

 类似资料:
  • 我想用PHP在我的简单ORM中实现一个钩子系统: 这会导致一个致命错误: 致命错误:调用私人方法付款::before_save()从上下文'记录'中 有道理。 我可以将范围更改为public,但这似乎很难看:在保存()之前,除了支付之外,没有人与

  • 问题内容: 如何从该类的静态方法获取该类的名称。例如 为了把它放在上下文中,我实际上想返回类名,作为异常中消息的一部分。 问题答案: 为了支持正确的重构(重命名类),则应使用以下任一方法: 或(感谢):

  • 问题内容: 假设我有以下两个课程 如果我启动一个beta类型的新对象,如何执行在alpha类而不是beta中找到的逻辑?我可以使用<-我想知道是否可行。 Eclipse IDE中的自动键入功能使我可以选择从class 或class中进行选择。 问题答案: 你可以做: 注意,这是对父级的引用,但是super()是它的构造函数。

  • 我知道在Java中,静态方法和实例方法一样是继承的,不同的是,当它们被重新声明时,父实现是隐藏的,而不是重写的。好吧,这有道理。但是,Java教程指出 接口中的静态方法从不继承。 然而,

  • 嘿,我正在尝试调用子类方法(ChildClass扩展了超类()) 它没有看到ChildClass方法,我只能调用SuperClass()中的方法,我知道这可能是一个愚蠢的问题,但无论如何干杯

  • 问题内容: 我正在阅读Khalid Mughal 撰写的Java™SCJP认证程序员指南。 在“继承”一章中,它说明了 成员的继承与声明的可访问性紧密相关。如果超类成员可以通过子类中的简单名称来访问(不使用任何其他语法,如super),则该成员被视为继承的 它还提到静态方法不是继承的。但是下面的代码完全可以: 我如何直接在课堂上使用?甚至更多,也可以。 这本书的解释仅适用于实例方法吗? 问题答案: