2010-08-06 18 views
123

聲明靜態字段我有以下類:檢索只在Java

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

是否有可能使用反射來得到的只是靜態字段列表?我知道我可以通過Test.class.getDeclaredFields()獲得所有字段的數組。但似乎沒有辦法確定一個Field實例是否代表一個靜態字段。

+0

我是一個Java更新,我想知道爲什麼的Java並沒有把這些功能都在Field類如C#,什麼是這種設計的好處?謝謝。 – Allen 2015-04-22 10:59:09

+0

https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Field.html#getModifiers-- – OrangeDog 2016-11-02 14:59:29

回答

244

你可以這樣說:

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

那很簡單,你可以使用修改器來檢查字段是靜態的或不是。 下面是這種任務的示例代碼。

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

我碰到這個問題,偶然意外,並認爲它需要一個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的可讀性。在實際上,你可能會寫這樣的:

​​