Comment obtenir le parent de la classe de base object super.getClass()
J'ai un petit problème avec Java (le fait d'être un programmeur C++).
J'ai 2 classes associées:
public class Patient() {
...
}
public class PatientPersistent extends Patient {
...
public void foo() {
System.out.println(super.getClass().toString());
}
}
Ce sera de sortie:
classe org.exemple.smartgwt.serveur.de modèle.PatientPersistent
Est-il un moyen d'obtenir le parent type de classe? c'est à dire
classe org.exemple.smartgwt.serveur.de modèle.Patient.
Cela me permettra de généraliser certaines méthodes dont j'ai besoin pour mettre en œuvre dans chaque enfant qui est affreux.
Merci!
Mise à JOUR
Je suis à l'aide de Bulldozers pour convertir mon domaine Hibernate objet d'un Serializable version. Je ne veux pas que le client de ce, de sorte que le client ne voit que le Patient classe. Sur le côté serveur-je effectuer 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 que mon point de vue. Je voudrais être en mesure de convertir l'objet c'est sérialisable formulaire afin que je puisse l'envoyer au client. C'est pourquoi je tiens à donner à la mère de son type. L'appel de la mappeur sera toujours la même chose, un objet source et un Dest.class.
Peut-être que je suis juste trop confus avec java.
Grâce
Peut-être il y a un parapluie problème à résoudre, de quoi êtes-vous en train d'essayer de réaliser, peut-être il ya une meilleure façon..?
Je peut toujours mettre en œuvre ces convertisseurs pour chaque persistante objet de données. J'ai pensé que je pourrais juste aller quelque part d'autre de la cartographie par juste de passage autour de la obj.class
OriginalL'auteur code-gijoe | 2010-07-20
Vous devez vous connecter pour publier un commentaire.
Mais ne pas l'utiliser. C'est certainement un signe de mauvaise conception.
Je n'arrive toujours pas à comprendre entièrement ce que vous essayez d'atteindre. Pourriez-vous plus d'explications dans la question.
J'ai essayé de nouveau et n'a pas encore, mais j'espère que mon explication est plus claire. De toute façon tout cela est juste pour éviter le copier/coller (ce qui est toujours une grande).
décrire l'ensemble de l'objet-écoulement - ce qui est le client, ce qui nécessite-t-il, qu'il envoie au serveur, et ce serveur doit renvoyer
Le client est l'INTERFACE utilisateur à distance de la station. 1 - le Client envoie des données du Patient via RPC (ce qui signifie que le patient est serializable). 2 - Serveur fait un peu de traitement de ces données. Disons qu'il sauve d'une nouvelle entrée. 3 - Après avoir atteint la base de données, Hibernate donne en retour un objet persistant PatientPersistent qui n'est pas sérialisable et ne peuvent pas être renvoyés au client. 4 - Utiliser des Bulldozers pour le transfert de la PatientPersistent un objet sérialisable version. 5 - le Retour de cet objet pour le client. Pas un parfait exemple, mais c'est assez proche de mon flux de travail.
OriginalL'auteur
Nice... super.getClass() est en fait l'Objet getClass(), qui retourne le runtime type de l'instance, il est appelé sur (ce dans ce cas). Par conséquent, vous recevez la même classe...
Au lieu de demander la classe d'exécution de ce à l'aide de la super mise en œuvre, Vous devez demander la super-classe de la classe retournée par getClass:
Et par la manière, que voulez-vous dire par "Cela me permettra de généraliser certaines méthodes dont j'ai besoin pour mettre en œuvre dans chaque enfant qui est affreux."? Êtes-vous sûr que vous n'avez pas d'autres choix de conception?
OriginalL'auteur
Object.getClass()
renvoie la runtime type d'un objet, de sorte ajoutantsuper
à l'appel n'a pas vraiment faire beaucoup.Vous pouvez utiliser
getClass().getSuperclass()
.OriginalL'auteur
Essayer:
getClass().getSuperclass().toString()
OriginalL'auteur
J'ai trouver pas mal de temps que la résolution d'un problème de "magie" dans la façon dont vous le suggérez conduit à une solution qui n'est pas très flexible.
Si vous essayez d'obtenir votre super classe, ce que vous voulez probablement, c'est à l'appel d'une méthode dans votre classe du parent qui, explicitement met en œuvre toutes les mesures que vous allez prendre après avoir regardé le parent de son type.
En outre, il ya une bonne chance que la conception serait encore mieux si la méthode vous étiez en train de mettre en œuvre étaient en fait DANS votre classe parent et cette méthode a fait référence à une méthode abstraite mis en œuvre dans la classe enfant--retournement de votre conception sur sa tête.
Bien sûr, je suis d'inférer ce à partir de votre désir d'obtenir le type parent et peut-être totalement faux, mais je pense que si le fait de connaître à vos parents de la classe est la réponse que vous cherchez, alors vous poser la mauvaise question--sauvegarder quelques pieds et de regarder à nouveau.
OriginalL'auteur