如何获取父基类对象 super.getClass()

2022-09-01 21:48:47

我对Java有一点问题(作为一个C++程序员)。

我有2个相关的类:

public class Patient() {
...
}

public class PatientPersistent extends Patient {
...
    public void foo() {
    System.out.println(super.getClass().toString());
    }
}

这将输出:

class org.example.smartgwt.server.model.PatientPersistent

有没有办法获取父类类型?即

class org.example.smartgwt.server.model.Patient.

这将允许我推广一些我需要在每个孩子身上实现的方法,这很糟糕。

谢谢!


更新

我正在使用 Dozer 将我的域 Hibernate 对象转换为可序列化版本。我不希望客户端知道这一点,因此客户端只能看到 Patient 类。在服务器端,我执行转换。

public class DataObject<Type> {

    private static final Class<Object> DstType = Type;

    public Object convert(Object srcData, final BeanFactory factory) {
        Mapper mapper = (Mapper)factory.getBean("dozerMapper");

        return (Object)mapper.map(srcData, DstType);
    }
}

public class Patient() implements Serializable {
    public Set foo;
}    

public class PatientPersistent extends Patient {

    public org.hibernate.collection.PersistentSet foo;
    DataObject<Patient> converter = new DataObject<Patient>;

    public Patient convertToSerializable(final BeanFactory factory) {
        return (Patient)converter.convert(this, factory);
    }
}

public class main() {
    // This object is not serializable so I cannot send it to the client
    PatientPersistent serializableBar = new PatientPersistent();

    // Using Dozer to copy the data PatientPersistent -> Patient
    // This will load the Dozer spring bean and copy as mapped
    Patient copiedSerializableData = serializableBar.convertToPersistent(bar, factory);
}

我知道这段代码不起作用,但这只是为了表达我的观点。我希望能够将对象转换为可序列化的形式,以便我可以将其发送回客户端。这就是为什么我想给父母的类型。调用映射器将始终是同一回事,即源对象和 Dest.class。

也许我只是对java太困惑了。

谢谢


答案 1
getClass().getSuperclass()

但不要使用它。这当然是设计糟糕的征兆。


答案 2

好。。。super.getClass() 实际上是 Object 的 getClass(),它返回调用它的实例的运行时类型(在本例中为 this)。因此,您会收到相同的类...

与其使用 super 的实现来请求它的运行时类,不如请求 getClass 返回的类的超类:

getClass().getSuperclass()

顺便说一句,你说的“这将允许我推广一些我需要在每个孩子身上实施的方法”是什么意思?您确定没有其他设计选择吗?