在基类构造函数中获取子类的名称

时间:2014-11-26 14:50:53

标签: java

假设我有一个抽象类

public abstract class Foo

和一个构造函数

public Foo()
{
}

鉴于必须从构造子类调用此构造函数,是否有办法在Foo构造函数中恢复该子类的名称?

我宁愿不用堆栈跟踪做一些邪恶的事情。

6 个答案:

答案 0 :(得分:3)

如果您想要类getClass().getSimpleName()这样的类名,只需使用

即可
public Foo() {
  declaredClassname = this.getClass().getSimpleName();
}

因为多态,它总是从子类调用getClass()。

答案 1 :(得分:1)

您可以使用以下内容:

public Foo()
{
    System.out.println(this.getClass().getSimpleName())
}

答案 2 :(得分:1)

当然:

getClass()

但请注意,子类实例(即其字段)仍未初始化,并将在基类构造函数之后完成。也不要出于同样的原因调用可覆盖的方法。

执行子类构造函数:

  1. super()或super(...)构造函数
  2. 已初始化的字段Xxx xxx = ...;
  3. 其余构造函数代码

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