假设我有一个抽象类
public abstract class Foo
和一个构造函数
public Foo()
{
}
鉴于必须从构造子类调用此构造函数,是否有办法在Foo
构造函数中恢复该子类的名称?
我宁愿不用堆栈跟踪做一些邪恶的事情。
答案 0 :(得分:3)
如果您想要类getClass().getSimpleName()
这样的类名,只需使用
public Foo() {
declaredClassname = this.getClass().getSimpleName();
}
因为多态,它总是从子类调用getClass()。
答案 1 :(得分:1)
您可以使用以下内容:
public Foo()
{
System.out.println(this.getClass().getSimpleName())
}
答案 2 :(得分:1)
当然:
getClass()
但请注意,子类实例(即其字段)仍未初始化,并将在基类构造函数之后完成。也不要出于同样的原因调用可覆盖的方法。
执行子类构造函数:
Xxx xxx = ...;
答案 3 :(得分:0)
您可以在子类构造函数中获取它并将其作为String传递给超类构造函数:
public foo(String className)
{
}
//subclass constructor
public subclass()
{
super("subclass");
}
或者你可以这样做:
public foo(String className)
{
}
//subclass constructor
public subclass()
{
super(this.getClass().getSimpleName());
}
答案 4 :(得分:0)
如果您在类层次结构中并且想要知道实际构造的类,则可以使用getClass()。 如果您想要知道“最顶层”类而不是“最底层”类,请迭代超类,直到找到自己的类为止。
import static java.lang.System.err;
abstract class A {
protected A() {
err.format("%s %s%n", getClass().getName(), getTopMostSubclass().getName());
}
Class<? extends A> getTopMostSubclass() {
Class<?> previousClass = getClass(), currentClass;
while (!A.class.equals(currentClass = previousClass.getSuperclass()))
previousClass = currentClass;
return (Class<? extends A>) previousClass;
}
}
class B extends A {}
class C extends B {}
public class Main {
public static void main(final String... args) {
new B(); // prints B B
new C(); // prints C B
}
}
答案 5 :(得分:0)
您只需在要了解该类的对象上调用getClass()函数即可。所以在你的情况下你会做这样的事情:
abstract class ParentClass {
public ParentClass() {
System.out.println(this.getClass().getName());
}
public String doSomething() {
return "Hello";
}
}
class ChildClass extends ParentClass {
}
...
...
ChildClass obj = new ChildClass();// will output ChildClass