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

我有一点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。

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

谢谢!


UPDATE

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

 public class DataObject { private static final Class 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 converter = new DataObject; 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); } 

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

也许我对java太困惑了。

谢谢

 getClass().getSuperclass() 

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

Nice … super.getClass()实际上是Object的getClass(),它返回调用它的实例的运行时类型(在本例中为)。 因此你收到同一个class级……

不要使用super的实现来请求运行时类,您应该要求getClass返回的类的超类:

 getClass().getSuperclass() 

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

Object.getClass()返回一个对象的运行时类型,因此在调用前加上super对实际上没有多大帮助。

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

尝试: getClass().getSuperclass().toString()

我发现很多时候用你所建议的方式解决“魔法”问题会导致解决方案不灵活。

如果你想要获得你的超级课程,你可能想要的是在你的父类中调用一个方法,该方法明确地实现你在查找父类型后要采取的任何动作。

此外,如果您当前实现的方法实际上是在您的父类中,并且该方法指的是在子类中实现的抽象方法 – 在您的头上翻转您的设计,那么设计很可能会更好。

当然我从你想要获得父母类型的过程中推断这一切并且可能是完全错误的,但我确实认为,如果你知道你父母的课程是你正在寻找的答案那么你会问错误的问题 – 返回向上几英尺再看一遍。