从超类中获取子类的名称

2022-08-31 11:22:44

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

class Entity {
    public static String getClass() {
        return Entity.class.getClass();
    }
}

现在我有另一个类扩展它。

class User extends Entity {
}

我想获取用户的类名:

System.out.println(User.getClass());

我的目标是看到“com.packagename.User”输出到控制台,但相反,我将以“com.packagename.Entity”结束,因为Entity类直接从静态方法引用。

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


答案 1

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

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

return this.getClass().getName();

当您有实例时,这将返回“实体”,当您有实例时,这将返回“用户”等。EntityUser


答案 2

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

System.out.println(Entity.getClass());
System.out.println(User.getClass());

它们编译为相同的字节代码(假设在 中定义了该方法)。Entity

此外,您如何以多态的方式调用此方法?