एक निजी क्षेत्र के साथ वर्ग

आप सभी फील्ड एक्सेस मॉडिफायर्स के बारे में अच्छी तरह से जानते हैं। और यदि किसी क्षेत्र में निजी संशोधक है, तो हम इसे बाहर से एक्सेस नहीं कर सकते हैं।


public class Person {
  private int age;
  public String nickname;
  public Person(int age, String nickname) {
   this.age = age;
   this.nickname = nickname;
  }
}

आइए अपनी मुख्य कक्षा में अभिगम्यता की जाँच करें:


public class Main {
   public static void main(String[] args) {
     Person person = new Person();  
     System.out.println(person.nickname);
    // System.out.println(person.age); No access to the field
  }
}

हमारी पहुंच नहीं हैआयुक्षेत्र, लेकिन हमारे पास प्रतिबिंब है। :) और इसकी मदद से हम निजी क्षेत्रों तक पहुंच और काम कर सकते हैं।

प्रतिबिंब का उपयोग करके किसी वस्तु से निजी क्षेत्र प्राप्त करना

आइए getDeclaredFields() मेथड का उपयोग करके अपनी कक्षा में सभी फ़ील्ड्स की एक सरणी प्राप्त करें। यह एक फील्ड ऑब्जेक्ट देता है जिसके साथ हम काम कर सकते हैं और संशोधित कर सकते हैं:


public static void main(String[] args) {
        Field[] fields = Person.class.getDeclaredFields();
        List<String> actualFieldNames = getFieldNames(fields);
        actualFieldNames.forEach(System.out::println);
    }

    static List<String> getFieldNames(Field[] fields) {
        List<String> fieldNames = new ArrayList<>();
        for (Field field : fields)
            fieldNames.add(Modifier.toString(field.getModifiers()) + " " + field.getName());
        return fieldNames;
    }
निजी आयु
सार्वजनिक उपनाम

GetFieldNames पद्धति में , हमें अपनी कक्षा से दो फ़ील्ड मिलते हैं। GetModifiers विधि हमारे क्षेत्र के संशोधक को लौटाती है, और getName उसका नाम लौटाता है। अब आइए इस क्षेत्र को संशोधित और एक्सेस करने का प्रयास करें। पहले, आइए सार्वजनिक क्षेत्र से डेटा प्राप्त करने का प्रयास करें:


public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
    Person person = new Person(10, "CodeGym");

    Field field = Person.class.getDeclaredField("nickname");
    String nickname = (String) field.get(person);
    System.out.println(nickname);

    System.out.println(person.nickname);
}
कोडजिम
कोडजिम

हम परावर्तन की सहायता से और वस्तु के संदर्भ का उपयोग करके क्षेत्र तक पहुँच सकते हैं। सब कुछ महान है! चलो एक निजी क्षेत्र में चलते हैं।

हम अनुरोधित फ़ील्ड का नाम हमारे निजी में बदल देंगेआयुमैदान:


public static void main(String[]args)throws NoSuchFieldException, IllegalAccessException {
		Person person = new Person(10, "CodeGym");

    Field field = Person.class.getDeclaredField("age");
    int age =(int)field.get(person);
    System.out.println(age);

    // System.out.println(person.age);
}

हमारे पास बनाई गई वस्तु के माध्यम से पहुंच नहीं है, इसलिए प्रतिबिंब का उपयोग करने का प्रयास करें। हमें त्रुटि मिलती है:

अवैध एक्सेस अपवाद

हमें एक IllegalAccessException मिलता है । आइए देखें कि अंदर क्या है:

आइए इसका पता लगाने की कोशिश करते हैं।

एक IllegalAccessException को फेंक दिया जाता है जब कोई एप्लिकेशन चिंतनशील रूप से एक उदाहरण (एक सरणी के अलावा) बनाने का प्रयास करता है, एक फ़ील्ड सेट या प्राप्त करता है, या एक विधि का आह्वान करता है, जब वर्तमान में निष्पादित विधि निर्दिष्ट वर्ग, फ़ील्ड की परिभाषा तक पहुंच नहीं रखती है, विधि, या निर्माता।

यहाँ के तरीके भी इस अपवाद को फेंक देते हैं। इस अपवाद से बचने के लिए, हम निजी क्षेत्र तक पहुँचने के लिए एक विशेष विधि का उपयोग करेंगे।

सेट एक्सेसिबल (बूलियन फ्लैग)

यह विधि किसी क्षेत्र या वर्ग के लिए सुरक्षा पहुँच जाँच से बचना संभव बनाती है। हम यह निर्धारित करने के लिए विधि को सही या गलत पास कर सकते हैं कि फ़ील्ड के लिए सुरक्षा पहुँच जाँच की जाएगी या नहीं। आइए हमारे कोड को ठीक करने का प्रयास करें:


public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
    Person person = new Person(10, "CodeGym");

    Field field = Person.class.getDeclaredField("age");
    field.setAccessible(true);

    int age = (int) field.get(person);
    System.out.println("The current value is " + age);
}

आइए परिणाम देखें:

वर्तमान मान 10 है

महान! हमें अपनी कक्षा के बारे में जानकारी मिली। आइए अपने क्षेत्र को एक नया मान निर्दिष्ट करके इसे बदलने का भी प्रयास करें:


public static void main(String[]args)throws NoSuchFieldException, IllegalAccessException {
Person person = new Person(10, "CodeGym");

    Field field = Person.class.getDeclaredField("age");
    field.setAccessible(true);

    field.set(person, 19);

    int age =(int)field.get(person);
    System.out.println("The current value is " + age);
}

अपना क्षेत्र बदलने के बाद, हम प्राप्त करते हैं:

वर्तमान मान 19 है

आइए setAccessible(false) को कॉल करने का प्रयास करें ।


public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
    Person person = new Person(10, "CodeGym");

    Field field = Person.class.getDeclaredField("age");
    
    field.setAccessible(true);
    field.set(person, 19);
    field.setAccessible(false);

    System.out.println("The current value is " + field.get(person));
}

एक्सेसिबिलिटी को झूठी में बहाल करने के बाद , जब हम प्राप्त विधि को कॉल करने का प्रयास करते हैं तो हम फिर से अपने अपवाद में भाग लेते हैं:

इसलिए निजी क्षेत्रों के साथ काम करते समय सावधान रहें , और यह न भूलें कि प्रतिबिंब एक बहुत ही शक्तिशाली उपकरण है!