聲明靜態字段我有以下類:檢索只在Java
public class Test {
public static int a = 0;
public int b = 1;
}
是否有可能使用反射來得到的只是靜態字段列表?我知道我可以通過Test.class.getDeclaredFields()
獲得所有字段的數組。但似乎沒有辦法確定一個Field
實例是否代表一個靜態字段。
聲明靜態字段我有以下類:檢索只在Java
public class Test {
public static int a = 0;
public int b = 1;
}
是否有可能使用反射來得到的只是靜態字段列表?我知道我可以通過Test.class.getDeclaredFields()
獲得所有字段的數組。但似乎沒有辦法確定一個Field
實例是否代表一個靜態字段。
你可以這樣說:
Field[] declaredFields = String.class.getDeclaredFields();
List<Field> staticFields = new ArrayList<Field>();
for (Field field : declaredFields) {
if (java.lang.reflect.Modifier.isStatic(field.getModifiers())) {
staticFields.add(field);
}
}
如果你可以添加開源依賴於你的項目,你也可以使用 FieldUtils.readDeclaredStaticField(Test.class,"a")
這不會給出靜態字段的列表。 – OrangeDog 2016-11-02 14:49:00
那很簡單,你可以使用修改器來檢查字段是靜態的或不是。 下面是這種任務的示例代碼。
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");
}
}
我碰到這個問題,偶然意外,並認爲它需要一個Java 8更新使用流:
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;
}
顯然,樣品是有點embelished的可讀性。在實際上,你可能會寫這樣的:
我是一個Java更新,我想知道爲什麼的Java並沒有把這些功能都在Field類如C#,什麼是這種設計的好處?謝謝。 – Allen 2015-04-22 10:59:09
https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Field.html#getModifiers-- – OrangeDog 2016-11-02 14:59:29