Recupera solo i campi statici dichiarati nella classe Java


163

Ho la seguente classe:

public class Test {
    public static int a = 0;
    public int b = 1;
}

È possibile utilizzare la riflessione per ottenere un elenco solo dei campi statici? Sono consapevole di poter ottenere una matrice di tutti i campi con Test.class.getDeclaredFields(). Ma sembra che non ci sia modo di determinare se Fieldun'istanza rappresenta o meno un campo statico.


Sono un java più recente, voglio sapere perché Java non ha inserito tutte queste funzionalità nella classe Field come C #, Qual è il vantaggio di questo design? Grazie.
Allen

Risposte:


327

Puoi farlo in questo modo:

Field[] declaredFields = Test.class.getDeclaredFields();
List<Field> staticFields = new ArrayList<Field>();
for (Field field : declaredFields) {
    if (java.lang.reflect.Modifier.isStatic(field.getModifiers())) {
        staticFields.add(field);
    }
}

12

Mi sono imbattuto per caso in questa domanda e ho sentito che aveva bisogno di un aggiornamento Java 8 usando gli stream:

public static List<Field> getStatics(Class<?> clazz) {
    List<Field> result;

    result = Arrays.stream(clazz.getDeclaredFields())
            // filter out the non-static fields
            .filter(f -> Modifier.isStatic(f.getModifiers()))
            // collect to list
            .collect(toList());

    return result;
}

Ovviamente, quel campione è un po 'arricchito per la leggibilità. In realtà, probabilmente lo scriveresti così:

public static List<Field> getStatics(Class<?> clazz) {
    return Arrays.stream(clazz.getDeclaredFields()).filter(f ->
        Modifier.isStatic(f.getModifiers())).collect(toList());
}

4
"In realtà, probabilmente lo scriveresti così" ... perché pensi che "in realtà" la leggibilità non sia importante?
Michael,

2
Prima di tutto, non penso che deridere qualcuno inglese su un sito come questo sia appropriato. A parte questo, non credo che i commenti nell'esempio abbellito servano a migliorare la leggibilità a qualcuno che abbia anche familiarità remota con i flussi, né l'inutile variabile di ritorno. Considererei entrambi i rumori se li avessi incontrati nel codice reale. Con più esperienza con i flussi sotto la cintura, oggi sceglierei di mantenere le nuove linee originali per la leggibilità. Nessuno è perfetto. Ho mirato a fornire sia un esempio esplicito per i nuovi programmatori, sia uno che fosse realistico.
Torque

3
Non stavo deridendo il tuo inglese. Il tuo inglese è buono. Non capisco nemmeno di cosa stai parlando. E sì, sono d'accordo che i commenti sono superflui e che la formattazione della prima è molto migliore. Il mio punto era che sembravi suggerire che "abbellire per la leggibilità" è negativo, quando la leggibilità è una metrica di qualità del codice incredibilmente importante.
Michael,


0

È semplice, è possibile utilizzare Modificatore per verificare se un campo è statico o meno. Ecco un codice di esempio per quel tipo di attività.

public static void printModifiers(Object o) {
    Class c = o.getClass();
    int m = c.getModifiers();
    if (Modifier.isPublic(m))
        System.out.println ("public");
    if (Modifier.isAbstract(m))
        System.out.println ("abstract");
    if (Modifier.isFinal(m))
        System.out.println ("final");
    if(Modifier.isStatic(m))
        System.out.println("static");
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.