ஒரு தனியார் துறையில் வகுப்பு

புல அணுகல் மாற்றிகளைப் பற்றி உங்கள் அனைவருக்கும் நன்றாகத் தெரியும். மேலும் ஒரு புலத்தில் தனிப்பட்ட மாற்றி இருந்தால் , அதை வெளியில் இருந்து அணுக முடியாது.


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 தூக்கி எறியப்படுகிறது . முறை, அல்லது கட்டமைப்பாளர்.

இங்குள்ள முறைகளும் இந்த விதிவிலக்கை வீசுகின்றன. இந்த விதிவிலக்கைத் தவிர்க்க, தனிப்பட்ட புலத்தை அணுக ஒரு சிறப்பு முறையைப் பயன்படுத்துவோம்.

அணுகக்கூடியது (பூலியன் கொடி)

புலம் அல்லது வகுப்பிற்கான பாதுகாப்பு அணுகல் சோதனைகளைத் தவிர்ப்பதை இந்த முறை சாத்தியமாக்குகிறது. புலத்திற்கான பாதுகாப்பு அணுகல் சோதனைகள் செய்யப்படுமா என்பதைத் தீர்மானிக்க, முறைக்கு சரி அல்லது தவறு என்று அனுப்பலாம் . எங்கள் குறியீட்டை சரிசெய்ய முயற்சிப்போம்:


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

தவறான அணுகலை மீட்டெடுத்த பிறகு , பெறு முறையை அழைக்க முயலும்போது மீண்டும் எங்கள் விதிவிலக்கைப் பெறுவோம் :

எனவே தனியார் துறைகளில் பணிபுரியும் போது கவனமாக இருங்கள் , மேலும் பிரதிபலிப்பு மிகவும் சக்திவாய்ந்த கருவி என்பதை மறந்துவிடாதீர்கள்!