Come ottenere l’object class base padre super.getClass ()

Ho un piccolo problema con Java (essendo un programmatore C ++).

Ho 2 classi correlate:

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

Questo produrrà:

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

C’è un modo per ottenere il tipo di class genitore? vale a dire

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

Questo mi permetterà di generalizzare alcuni metodi che ho bisogno di implementare in ogni bambino che è orribile.

Grazie!


AGGIORNARE

Sto usando Dozer per convertire il mio object Hibernate del dominio in una versione Serializable. Non voglio che il client lo sappia, quindi il client vede solo la class Patient . Sul lato server eseguo le conversioni.

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

So che questo codice non funziona, ma è solo per farmi capire. Mi piacerebbe essere in grado di convertire l’object nel suo modulo serializzabile in modo che possa inviarlo al client. Ecco perché mi piacerebbe dare il tipo dei genitori. Chiamare il mapper sarà sempre la stessa cosa, un object sorgente e una class Dest.class.

Forse sono troppo confuso con java.

Grazie

 getClass().getSuperclass() 

Ma non usare questo. È certamente un segno di cattivo design.

Bello … super.getClass () è in realtà Object’s getClass (), che restituisce il tipo di runtime dell’istanza su cui è stato richiamato ( questo in questo caso). Quindi ricevi la stessa class …

Invece di chiedere la class runtime usando l’implementazione del super, dovresti chiedere la super class della class restituita da getClass:

 getClass().getSuperclass() 

E a proposito, cosa intendi con “Questo mi permetterà di generalizzare alcuni metodi che ho bisogno di attuare in ogni bambino che è terribile.”? Sei sicuro di non avere altra scelta di design?

Object.getClass() restituisce il tipo di runtime di un object, quindi prependere super alla chiamata non fa molto.

Potresti usare getClass().getSuperclass() .

Prova: getClass().getSuperclass().toString()

Trovo molto tempo che risolvere un problema con “magia” nel modo in cui si suggerisce porta a una soluzione che non è molto flessibile.

Se stai cercando di ottenere la class del tuo super, quello che probabilmente vuoi è chiamare un metodo nella class dei tuoi genitori che implementa esplicitamente qualsiasi azione tu avresti intrapreso dopo aver cercato il tipo del genitore.

Inoltre, ci sono buone probabilità che il design sia ancora migliore se il metodo che stavi implementando fosse effettivamente nella tua class genitore e quel metodo si riferisse ad un metodo astratto implementato nella class figlio – sfogliando il tuo progetto sulla sua testa.

Ovviamente sto deducendo tutto questo dal tuo desiderio di ottenere il tipo di genitore e potrebbe essere totalmente sbagliato, ma penso che se la class del tuo genitore è la risposta che stai cercando, allora stai facendo la domanda sbagliata – indietro su un paio di piedi e guarda di nuovo.