Как получить объект родительского базового класса super.getClass()

У меня есть небольшая проблема с Java (будучи программистом на С++).

У меня есть 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. Я не хочу, чтобы клиент знал об этом, поэтому клиент видит только класс Пациент. На стороне сервера я выполняю преобразования.

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);
}

Я знаю, что этот код не работает, но я просто хочу сказать. Я хотел бы иметь возможность преобразовать объект в его сериализуемую форму, чтобы я мог отправить его обратно клиенту. Вот почему я хотел бы предоставить родительский тип. Вызов mapper всегда будет одним и тем же, исходным и Dest.class.

Может быть, я просто слишком смущен java.

Спасибо

Ответ 1

getClass().getSuperclass()

Но не используйте это. Это, безусловно, признак плохого дизайна.

Ответ 2

Nice... super.getClass() на самом деле Object getClass(), который возвращает тип времени выполнения экземпляра, на который он вызывается (это в данном случае). Поэтому вы получаете тот же класс...

Вместо того, чтобы запрашивать класс выполнения, используя супер-реализацию, вы должны попросить суперкласс класса, возвращаемого getClass:

getClass().getSuperclass()

И, кстати, что вы подразумеваете под "Это позволит мне обобщить некоторые методы, которые мне нужно реализовать в каждом ребенке, который ужасен".? Вы уверены, что у вас нет другого выбора дизайна?

Ответ 3

Object.getClass() возвращает тип runtime объекта, поэтому добавление super к вызову на самом деле мало.

Вы можете использовать getClass().getSuperclass().

Ответ 4

Попробуйте: getClass().getSuperclass().toString()

Ответ 5

Я нахожу много времени, когда решение проблемы с "магии" в том, как вы предлагаете, приводит к не очень гибкому решению.

Если вы пытаетесь получить свой суперкласс, то, возможно, вы хотите вызвать метод в своем родительском классе, который явно реализует все действия, которые вы собираетесь предпринять после того, как вы посмотрели родительский тип.

Кроме того, существует хорошая вероятность того, что дизайн будет еще лучше, если бы метод, который вы в настоящее время выполняли, был фактически в вашем родительском классе, и этот метод ссылался на абстрактный метод, реализованный в дочернем классе, - переворачивая ваш дизайн на его голова.

Конечно, я вывел все это из вашего желания получить родительский тип и, возможно, полностью ошибаюсь, но я думаю, что, зная, что ваш родительский класс является ответом, который вы ищете, вы задаете неправильный вопрос - Вернитесь на несколько футов и посмотрите еще раз.