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


163

मेरे पास निम्न वर्ग है:

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

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


मैं एक जावा नया हूं, मैं जानना चाहता हूं कि जावा ने सी # जैसी फील्ड क्लास में ये फीचर क्यों नहीं डाले, इस डिजाइन से क्या फायदा है? धन्यवाद।
एलन

जवाबों:


327

आप इसे इस तरह से कर सकते हैं:

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

12

मैं दुर्घटना से इस सवाल से लड़खड़ा गया और लगा कि इसे स्ट्रीम का उपयोग करके जावा 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;
}

जाहिर है, वह नमूना पठनीयता के लिए थोड़ा उभरा हुआ है। वास्तव में, आप इसे इस तरह से लिखेंगे:

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

4
"वास्तव में, आप संभवतः इसे इस तरह से लिखेंगे" ... आप ऐसा क्यों सोचते हैं कि "वास्तविकता में" यह पठनीयता महत्वपूर्ण नहीं है?
माइकल

2
सबसे पहले, मुझे नहीं लगता कि किसी की साइट पर अंग्रेजी का मजाक उड़ाना उचित है। इसके अलावा, मुझे विश्वास नहीं है कि सुशोभित उदाहरण में टिप्पणियां किसी व्यक्ति के लिए पठनीयता में सुधार करने के लिए काम करती हैं, यहां तक ​​कि धाराओं से भी दूर से परिचित हैं, और न ही बेकार रिटर्न चर। यदि मैं वास्तविक कोड में उनका सामना करता हूं तो मैं दोनों शोर पर विचार करूंगा। मेरी बेल्ट के तहत धाराओं के साथ अधिक अनुभव के साथ, मैं आज पठनीयता के लिए मूल नईलाइन्स रखने का विकल्प चुनूंगा। कोई भी पूर्णतया कुशल नहीं होता। मैंने दोनों उदाहरणों को प्रदान करने का लक्ष्य रखा जो नए प्रोग्रामरों के साथ-साथ यथार्थवादी थे।
टोक़

3
मैं आपकी अंग्रेजी का मजाक नहीं उड़ा रहा था। आपकी अंग्रेजी अच्छी है। मुझे यह भी समझ में नहीं आ रहा है कि आप किस बारे में बात कर रहे हैं। और हाँ, मैं मानता हूँ कि टिप्पणियाँ बहुत ही शानदार हैं और यह कि प्रारूपण पहले से बहुत बेहतर है। मेरा कहना यह था कि आपको लगता है कि "पठनीयता के लिए अलंकृत" बुरा है, जब पठनीयता एक महत्वपूर्ण कोड गुणवत्ता मीट्रिक है।
माइकल


0

Thats सरल, आप एक क्षेत्र स्थिर है या नहीं यह जांचने के लिए संशोधक का उपयोग कर सकते हैं। यहाँ उस तरह के कार्य के लिए एक नमूना कोड है।

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");
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.