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类是直接从静态方法引用的.
如果这不是一个静态方法,可以通过this
在Entity
类中使用关键字(即:)来轻松解决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
等.
Mic*_*rdt 40
不可能.静态方法在任何方面都不是运行时多态的.区分这些情况绝对不可能:
System.out.println(Entity.getClass());
System.out.println(User.getClass());
Run Code Online (Sandbox Code Playgroud)
它们编译为相同的字节代码(假设该方法已定义Entity
).
此外,你如何称呼这种方法,使其具有多态性?
你的问题很模糊,但据我所知,你想从静态方法知道当前的类.类继承的事实是无关紧要的,但为了讨论起见,我也是这样实现的.
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(); } }
这适合我
this.getClass().asSubclass(this.getClass())
Run Code Online (Sandbox Code Playgroud)
但我不确定它是如何工作的.
归档时间: |
|
查看次数: |
77716 次 |
最近记录: |