Yalnızca Java sınıfında bildirilen statik alanları alın


163

Aşağıdaki sınıf var:

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

Yalnızca statik alanların bir listesini almak için yansıma kullanmak mümkün müdür? Tüm alanlardan bir dizi alabileceğimin farkındayım Test.class.getDeclaredFields(). Ancak bir Fieldörneğin statik bir alanı temsil edip etmediğini belirlemenin bir yolu yok gibi görünüyor .


Ben bir java daha yeni, Java neden bu özelliği tüm C # gibi Field sınıfına koymadı bilmek istiyorum, Bu tasarımın faydası nedir? Teşekkürler.
Allen

Yanıtlar:


327

Bunu şu şekilde yapabilirsiniz:

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

Bu soruya yanlışlıkla rastladım ve akışları kullanarak bir Java 8 güncellemesine ihtiyaç duydum:

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

Açıkçası, bu örnek okunabilirlik için biraz süslenmiştir. Aslında, muhtemelen şöyle yazacaksınız:

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

4
“Aslında, muhtemelen böyle yazıyorsunuz” ... neden "gerçekte" okunabilirliğin önemli olmadığını düşünüyorsunuz?
Michael

2
Öncelikle, böyle bir sitede birisinin İngilizce alay etmesinin uygun olduğunu düşünmüyorum. Bunun yanı sıra, süslenmiş örnekteki yorumların akışlara uzaktan aşina olan birine bile okunabilirliği artırmaya hizmet ettiğine veya işe yaramaz dönüş değişkenine inanmadığına inanmıyorum. Onları gerçek kodda karşılaşırsam hem gürültü düşünün. Kemerimin altındaki akarsularla ilgili daha fazla deneyim ile, bugün orijinal yeni satırları okunabilirlik için tutmayı tercih ederim. Kimse mükemmel değildir. Hem yeni programcılar için açık hem de gerçekçi bir örnek sunmayı amaçladım.
Tork

3
İngilizcenle alay etmedim. İngilizcen iyi. Neden bahsettiğini bile anlamıyorum. Ve evet, yorumların gereksiz olduğunu ve ilkinin biçimlendirmesinin çok daha iyi olduğunu kabul ediyorum. Demek istediğim, okunabilirlik inanılmaz derecede önemli bir kod kalitesi metriği olduğunda "okunabilirlik için süslemenin" kötü olduğunu öne sürdüğünüz oldu.
Michael


0

Bu basit, bir alanın statik olup olmadığını kontrol etmek için Değiştirici kullanabilirsiniz. İşte bu tür bir görev için örnek bir kod.

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");
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.