Ambil hanya bidang statis yang dideklarasikan di kelas Java

163

Saya memiliki kelas berikut:

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

Apakah mungkin menggunakan refleksi untuk mendapatkan daftar bidang statis saja? Saya sadar saya bisa mendapatkan array semua bidang dengan Test.class.getDeclaredFields(). Tapi sepertinya tidak ada cara untuk menentukan apakah Fieldturunan mewakili medan statis atau tidak.

Anders
sumber
Saya seorang java yang lebih baru, saya ingin tahu mengapa Java tidak meletakkan semua fitur ini di kelas Field seperti C #, Apa manfaat dari desain ini? Terima kasih.
Allen

Jawaban:

327

Anda dapat melakukannya seperti ini:

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);
    }
}
Abhinav Sarkar
sumber
12

Saya menemukan pertanyaan ini secara tidak sengaja dan merasa dibutuhkan pembaruan Java 8 menggunakan 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;
}

Jelas, sampel itu sedikit diperindah untuk dibaca. Sebenarnya, Anda mungkin akan menulisnya seperti ini:

public static List<Field> getStatics(Class<?> clazz) {
    return Arrays.stream(clazz.getDeclaredFields()).filter(f ->
        Modifier.isStatic(f.getModifiers())).collect(toList());
}
Torsi
sumber
4
"Sebenarnya, Anda mungkin akan menulis seperti ini" ... mengapa Anda berpikir bahwa "dalam kenyataannya" bahwa keterbacaan tidak penting?
Michael
2
Pertama, saya tidak berpikir mengejek seseorang dalam bahasa Inggris di situs seperti ini adalah tepat. Selain itu, saya tidak percaya bahwa komentar dalam contoh yang diperindah berfungsi untuk meningkatkan keterbacaan kepada seseorang yang bahkan akrab dengan stream, juga tidak variabel pengembalian yang tidak berguna. Saya akan mempertimbangkan keduanya noise jika saya temui mereka dalam kode aktual. Dengan lebih banyak pengalaman dengan stream di bawah ikat pinggang saya, saya hari ini akan memilih untuk menjaga baris baru agar mudah dibaca. Tidak ada yang sempurna. Saya bertujuan untuk memberikan contoh yang eksplisit untuk programmer baru maupun yang realistis.
Torsi
3
Saya tidak mengejek bahasa Inggris Anda. Bahasa Inggrismu bagus. Aku bahkan tidak mengerti apa yang kamu bicarakan. Dan ya, saya setuju bahwa komentarnya berlebihan dan bahwa format yang pertama jauh lebih baik. Maksud saya adalah bahwa Anda tampaknya menyarankan "memperindah untuk dibaca" adalah buruk, ketika keterbacaan adalah metrik kualitas kode yang sangat penting.
Michael
0

Sederhana, Anda dapat menggunakan Pengubah untuk memeriksa apakah suatu bidang statis atau tidak. Berikut adalah contoh kode untuk tugas semacam itu.

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");
}
Salman Saleh
sumber