È possibile eseguire il ciclo tra i membri di una classe in Java?
Domanda
Ho un DTO che ha un sacco di membri. Mi chiedevo se Java supporta l'idea di un for (in) per la classe. Non credo che lo faccia, ma mi farebbe risparmiare un sacco di dolore se lo facesse, quindi, ho pensato che avrei lanciato la domanda là fuori.
Soluzione
Bene, puoi farlo con la riflessione:
for (Field field : clazz.getFields())
{
...
}
(O l'equivalente per metodi ecc.)
È quindi possibile ottenere i valori dei campi per un'istanza specifica o valori statici.
Altri suggerimenti
Lo fa, anche se un po 'seccante.
Devi usare la riflessione.
Vedi: Class.getDeclaredFieds ()
Restituisce una matrice di oggetti Field che riflettono tutti i campi dichiarati dalla classe o dall'interfaccia rappresentata da questo oggetto Class
Puoi vedere un esempio qui
Esistono tre modi per ottenere un oggetto Field da un oggetto Class.
Class cls = java.awt.Point.class;
// By obtaining a list of all declared fields.
Field[] fields = cls.getDeclaredFields();
// By obtaining a list of all public fields,
// both declared and inherited.
fields = cls.getFields();
for (int i=0; i<fields.length; i++) {
Class type = fields[i].getType();
process(fields[i]);
}
// By obtaining a particular Field object.
// This example retrieves java.awt.Point.x.
try {
Field field = cls.getField("x");
process(field);
} catch (NoSuchFieldException e) {
}
Vedi la classe Class definizione per più opzioni.
Sì, utilizza API di riflessione . In particolare, controlla i metodi getFields
e getMethods
da Class
.
Puoi usare la riflessione per ottenere tutti i membri e le funzioni.
Forse devi chiederti perché quel DTO ha così tanti membri che pensi che ciò sia necessario. Potrebbe essere il momento di refactoring.
Dai un'occhiata al quadro di riflessione in base al quale puoi introspettare la classe per queste informazioni.
http: / /java.sun.com/j2se/1.4.2/docs/api/java/lang/reflect/package-summary.html