Soru Sadece Java sınıfında bildirilen statik alanları al


Aşağıdaki sınıfa sahibim:

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

Sadece statik alanların bir listesini almak için yansıma kullanmak mümkün mü? Tüm alanların bir dizi alabileceğinin farkındayım. Test.class.getDeclaredFields(). Ama öyle bir şey olup olmadığını belirlemenin bir yolu yok gibi görünüyor. Field örnek statik bir alanı temsil eder veya etmeyebilir.


131
2017-08-06 09:10


Menşei


Ben daha yeni bir java'yım, Java'nın bu özelliği neden C # gibi bir alan sınıfına koymadığını bilmek istiyorum, Bu tasarımın yararı nedir? Teşekkürler. - Allen
docs.oracle.com/javase/8/docs/api/java/lang/reflect/... - OrangeDog


Cevaplar:


Bunu böyle yapabilirsin:

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

261
2017-08-06 09:16





Bu soruya kazara rastladım ve akışları kullanarak Java 8 güncellemesine ihtiyaç duyduğunu hissettim:

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 büyülenmiş. Aslında, muhtemelen böyle yazabilirsiniz:

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

5
2017-10-19 14:44





Projenize açık kaynaklı bağımlılıklar ekleyebiliyorsanız, ayrıca FieldUtils.readDeclaredStaticField (Test.class, "a")


0
2018-05-17 20:48



Bu statik alanların bir listesini vermez. - OrangeDog


Thats Simple, bir alanın statik olup olmadığını kontrol etmek için Değiştiriciyi kullanabilirsiniz. İşte bu tür bir görev için örnek 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");
}
}

0
2017-10-01 19:33