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.
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);
}
}
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());
}
Projenize açık kaynaklı bağımlılıklar ekleyebiliyorsanız, ayrıca
FieldUtils.readDeclaredStaticField (Test.class, "a")
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");
}
}