2010-08-06 14 views
123

में घोषित पुनः प्राप्त मैं निम्नलिखित वर्ग:केवल स्थिर क्षेत्रों जावा वर्ग

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

यह प्रतिबिंब का उपयोग करने के केवल स्थिर क्षेत्रों की एक सूची प्राप्त करना संभव है? मुझे पता है कि मैं Test.class.getDeclaredFields() के साथ सभी क्षेत्रों की एक सरणी प्राप्त कर सकता हूं। लेकिन ऐसा लगता है कि यह निर्धारित करने का कोई तरीका नहीं है कि Field उदाहरण स्थिर क्षेत्र का प्रतिनिधित्व करता है या नहीं।

+0

मैं एक जावा नए हूँ, मैं जानना चाहता है कि जावा की तरह सी # इन की सुविधा नहीं लगाया सभी फील्ड कक्षा में चाहते हैं, इस डिजाइन से क्या लाभ है? धन्यवाद। – Allen

+0

https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Field.html#getModifiers - – OrangeDog

उत्तर

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

आप अपने प्रोजेक्ट के लिए खुला स्रोत निर्भरता में जोड़ सकते हैं, तो आप भी उपयोग कर सकते हैं FieldUtils.readDeclaredStaticField(Test.class,"a")

+2

यह स्थिर फ़ील्ड की सूची नहीं देता है। – OrangeDog

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

मैं दुर्घटना से इस सवाल भर में ठोकर खाई और यह एक जावा 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 है। वास्तव में, आप इसे इस तरह से होने की संभावना लिखना होगा:

public static List<Field> getStatics(Class<?> clazz) { 
    return Arrays.stream(clazz.getDeclaredFields()).filter(f -> 
     Modifier.isStatic(f.getModifiers())).collect(toList()); 
} 
संबंधित मुद्दे