web-dev-qa-db-fra.com

Comment obtenir l'objet de classe de base parent super.getClass ()

J'ai un petit problème avec Java (étant un programmeur C++).

J'ai 2 classes liées:

public class Patient() {
...
}

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

Cela produira:

classe org.example.smartgwt.server.model.PatientPersistent

Existe-t-il un moyen d'obtenir le type de classe parent? c'est à dire.

classe org.example.smartgwt.server.model.Patient.

Cela me permettra de généraliser certaines méthodes que je dois mettre en œuvre dans chaque enfant, ce qui est horrible.

Merci!


MISE À JOUR

J'utilise Dozer pour convertir mon objet Hibernate de domaine en une version sérialisable. Je ne veux pas que le client sache cela, donc le client ne voit que la classe Patient. Côté serveur, j'effectue des conversions.

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

Je sais que ce code ne fonctionne pas, mais c'est juste pour faire valoir mon point de vue. Je voudrais pouvoir convertir l'objet dans sa forme sérialisable afin de pouvoir le renvoyer au client. C'est pourquoi je voudrais donner le type du parent. Appeler le mapper sera toujours la même chose, un objet source et une Dest.class.

Peut-être que je suis tout simplement trop confus avec Java.

Merci

21
code-gijoe
getClass().getSuperclass()

Mais ne l'utilisez pas. C'est certainement un signe de mauvaise conception.

33
Bozho

Nice ... super.getClass () est en fait getClass () d'Object, qui renvoie le type d'exécution de l'instance sur laquelle il est invoqué (this dans ce cas). Vous recevez donc la même classe ...

Au lieu de demander la classe d'exécution de this en utilisant l'implémentation du super, vous devez demander la super classe de la classe retournée par getClass:

getClass().getSuperclass()

Et au fait, que voulez-vous dire par "cela me permettra de généraliser certaines méthodes que je dois mettre en œuvre chez chaque enfant, ce qui est horrible"? Êtes-vous sûr de ne pas avoir d'autre choix de conception?

8
Eyal Schneider

Object.getClass() renvoie le type runtime d'un objet, donc ajouter super à l'appel ne fait pas grand-chose.

Vous pouvez utiliser getClass().getSuperclass().

7
Mike Daniels

Essayez: getClass().getSuperclass().toString()

2
Mike Tunnicliffe

Je trouve beaucoup de temps que la résolution d'un problème avec la "magie" dans la façon dont vous suggérez mène à une solution qui n'est pas très flexible.

Si vous essayez d'obtenir la classe de votre super, ce que vous voulez probablement, c'est d'appeler une méthode dans la classe de votre parent qui implémente explicitement toute action que vous alliez entreprendre après avoir recherché le type du parent.

En outre, il y a de fortes chances que la conception soit encore meilleure si la méthode que vous implémentez actuellement était réellement DANS votre classe parent et que cette méthode faisait référence à une méthode abstraite implémentée dans la classe enfant - renversant votre conception sur sa tête.

Bien sûr, je déduis tout cela de votre désir d'obtenir le type de parent et peut être totalement faux, mais je pense que si connaître la classe de vos parents est la réponse que vous cherchez, vous posez la mauvaise question - retour quelques pieds et regardez à nouveau.

1
Bill K