从超类中获取子类的名称

Mat*_*ins 70 java class subclass super superclass

假设我有一个名为的基类Entity.在那个类中,我有一个静态方法来检索类名:

class Entity {
    public static String getClass() {
        return Entity.class.getClass();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我有另一个类扩展.

class User extends Entity {
}
Run Code Online (Sandbox Code Playgroud)

我想获得User的类名:

System.out.println(User.getClass());
Run Code Online (Sandbox Code Playgroud)

我的目标是看到"com.packagename.User"输出到控制台,但是我将最终得到"com.packagename.Entity",因为Entity类是直接从静态方法引用的.

如果这不是一个静态方法,可以通过thisEntity类中使用关键字(即:)来轻松解决return this.class.getClass().但是,我需要这种方法保持静态.有关如何处理此问题的任何建议?

mat*_*t b 90

不要使方法静态.问题是,当您调用时,getClass()您正在调用超类中的方法 - 静态方法不会被继承.此外,你基本上是名字阴影Object.getClass(),这是令人困惑的.

如果需要在超类中记录类名,请使用

return this.getClass().getName();
Run Code Online (Sandbox Code Playgroud)

当你有一个Entity实例时会返回"Entity",当你有一个实例时会返回" User" User等.

  • @Matt Huggins,这就是为什么我的回答中的第一句话说"不要让方法静止" (30认同)
  • 即使这个答案没有解决"但是,我需要这个方法保持静态",如果(像我一样)你在这里寻找如何在一个不需要静态的方法中获取类是很有用的.;) (5认同)
  • @ matt b - 这就是为什么我的问题的倒数第二句说"但是,我需要这种方法保持静止." (2认同)

Mic*_*rdt 40

不可能.静态方法在任何方面都不是运行时多态的.区分这些情况绝对不可能:

System.out.println(Entity.getClass());
System.out.println(User.getClass());
Run Code Online (Sandbox Code Playgroud)

它们编译为相同的字节代码(假设该方法已定义Entity).

此外,你如何称呼这种方法,使其具有多态性?

  • +1,完全正确.整个问题源于对静态方法如何工作的误解. (2认同)

Gil*_*ead 6

你的问题很模糊,但据我所知,你想从静态方法知道当前的类.类继承的事实是无关紧要的,但为了讨论起见,我也是这样实现的.

class Parent {
    public static void printClass() {
      System.out.println(Thread.currentThread().getStackTrace()[2].getClassName());
    }
}

public class Test extends Parent {
    public static void main(String[] args) {
      printClass();
    }
}

  • 正如我所说,马特的问题含糊不清,我提供了一个可能的答案.很明显,你的版本没有提供与我的代码相同的输出,所以没有比较 - 你在谈论一个不同的解决方案.阅读线程堆栈不是一个黑客,它是检查一个人的调用层次结构的正常方式(当然我跳过健全性检查,因为这是一个例子). (2认同)

sir*_*009 5

这适合我

this.getClass().asSubclass(this.getClass())
Run Code Online (Sandbox Code Playgroud)

但我不确定它是如何工作的.