java - जावा प्रतिबिंब में GetFields और getDeclaredFields के बीच क्या अंतर है




reflection (2)

getFields ()

पूरे वर्ग पदानुक्रम के सभी public क्षेत्रों।

getDeclaredFields ()

सभी क्षेत्रों, उनकी पहुंच के बावजूद, लेकिन केवल वर्तमान वर्ग के लिए, कोई भी मूल वर्ग नहीं है जो वर्तमान वर्ग से विरासत में हो सकता है।

पदानुक्रम के सभी क्षेत्रों को पाने के लिए

मैंने निम्नलिखित कार्य लिखा है:

public static Iterable<Field> getFieldsUpTo(@Nonnull Class<?> startClass, 
                                   @Nullable Class<?> exclusiveParent) {

   List<Field> currentClassFields = Lists.newArrayList(startClass.getDeclaredFields());
   Class<?> parentClass = startClass.getSuperclass();

   if (parentClass != null && 
          (exclusiveParent == null || !(parentClass.equals(exclusiveParent)))) {
     List<Field> parentClassFields = 
         (List<Field>) getFieldsUpTo(parentClass, exclusiveParent);
     currentClassFields.addAll(parentClassFields);
   }

   return currentClassFields;
}

Object से फ़ील्ड को पुनर्प्राप्त करने से रोकने के लिए exclusiveParent वर्ग प्रदान किया जाता है। यदि आप Object फ़ील्ड चाहते हैं तो यह null हो सकता है।

स्पष्टीकरण के लिए, Lists.newArrayList आता है।

अद्यतन करें

LibEx , उपरोक्त कोड ReflectionUtils LibEx में मेरी LibEx परियोजना में LibEx पर प्रकाशित है।

मैं जावा प्रतिबिंब का उपयोग करते समय getDeclaredFields विधि और getDeclaredFields विधि के बीच के अंतर के बारे में थोड़ा उलझन में हूं।

मैंने पढ़ा है कि getDeclaredFields आपको कक्षा के सभी क्षेत्रों तक पहुंच प्रदान करता है और यह मिलता है कि फ़ील्ड केवल सार्वजनिक फ़ील्ड लौटाती है। यदि ऐसा है, तो आप हमेशा getDeclaredFields उपयोग क्यों नहीं करेंगे?

क्या कोई इस पर विस्तृत जानकारी दे सकता है, और दो तरीकों के बीच अंतर को समझा सकता है, और कब आप दूसरे पर एक का उपयोग करना चाहते हैं?


जैसा कि पहले ही उल्लेख किया गया है, Class.getDeclaredField(String) केवल उस Class के फ़ील्ड को देखता है जिसमें आप इसे कॉल करते हैं।

यदि आप Class पदानुक्रम में एक Field खोजना चाहते हैं, तो आप इस सरल कार्य का उपयोग कर सकते हैं:

/**
 * Returns the first {@link Field} in the hierarchy for the specified name
 */
public static Field getField(Class<?> clazz, String name) {
    Field field = null;
    while (clazz != null && field == null) {
        try {
            field = clazz.getDeclaredField(name);
        } catch (Exception e) {
        }
        clazz = clazz.getSuperclass();
    }
    return field;
}

उदाहरण के लिए, सुपरक्लास से private क्षेत्र ढूंढना उपयोगी होता है। साथ ही, यदि आप इसके मूल्य को संशोधित करना चाहते हैं, तो आप इसका उपयोग इस प्रकार कर सकते हैं:

/**
 * Sets {@code value} to the first {@link Field} in the {@code object} hierarchy, for the specified name
 */
public static void setField(Object object, String fieldName, Object value) throws Exception {
    Field field = getField(object.getClass(), fieldName);
    field.setAccessible(true);
    field.set(object, value);
}




reflection