खाजगी क्षेत्रासह वर्ग

फील्ड ऍक्सेस मॉडिफायर्सबद्दल तुम्हा सर्वांना चांगले माहिती आहे. आणि जर एखाद्या फील्डमध्ये खाजगी सुधारक असेल तर आम्ही बाहेरून प्रवेश करू शकत नाही.


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

असत्य वर प्रवेशयोग्यता पुनर्संचयित केल्यानंतर , आम्ही प्राप्त पद्धतीला कॉल करण्याचा प्रयत्न करतो तेव्हा आम्ही पुन्हा आमच्या अपवादात जातो :

त्यामुळे खाजगी क्षेत्रात काम करताना सावधगिरी बाळगा आणि हे विसरू नका की प्रतिबिंब हे खूप शक्तिशाली साधन आहे!