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

cod*_*joe 17 java class dozer

我有一点Java问题(作为一名C++程序员).

我有2个相关的课程:

public class Patient() {
...
}

public class PatientPersistent extends Patient {
...
    public void foo() {
    System.out.println(super.getClass().toString());
    }
}
Run Code Online (Sandbox Code Playgroud)

这将输出:

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

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

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

这将允许我概括一些我需要在每个孩子中实施的方法,这些方法很糟糕.

谢谢!


UPDATE

我正在使用Dozer将我的域Hibernate对象转换为Serializable版本.我不希望客户知道这一点,因此客户只能看到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);
}
Run Code Online (Sandbox Code Playgroud)

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

也许我对java太困惑了.

谢谢

Boz*_*zho 33

getClass().getSuperclass()
Run Code Online (Sandbox Code Playgroud)

但是不要使用它.这肯定是糟糕设计的标志.

  • 好吧,我不会使用它。但是你能启发我并告诉我为什么这是一个坏主意吗? (3认同)

Eya*_*der 8

尼斯... super.getClass()实际上是对象的的getClass(),它返回它是在调用的实例的运行时类型(在这种情况下).因此你收到同一个班级......

相反,要求运行时类的这种使用超类的实现,你应该问的超类通过的getClass返回的类:

getClass().getSuperclass()
Run Code Online (Sandbox Code Playgroud)

顺便说一下,你的意思是什么?"这将允许我概括一些我需要在每个孩子中实施的方法,这是非常糟糕的."?您确定没有其他设计选择吗?


Mik*_*els 7

Object.getClass()返回对象的运行时类型,因此super在调用之前不会做太多事情.

你可以用getClass().getSuperclass().