একটি প্রাইভেট ফিল্ড সহ ক্লাস

আপনি সবাই ফিল্ড অ্যাক্সেস মডিফায়ার সম্পর্কে খুব ভাল জানেন। এবং যদি একটি ক্ষেত্রে ব্যক্তিগত সংশোধক থাকে, তাহলে আমরা বাইরে থেকে এটি অ্যাক্সেস করতে পারি না।


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

সেটঅ্যাকসেসিবল(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));
}

মিথ্যাতে অ্যাক্সেসযোগ্যতা পুনরুদ্ধার করার পরে , যখন আমরা get মেথড কল করার চেষ্টা করি তখন আমরা আবার আমাদের ব্যতিক্রমের মধ্যে চলে যাই :

তাই ব্যক্তিগত ক্ষেত্রে কাজ করার সময় সতর্ক থাকুন , এবং ভুলে যাবেন না যে প্রতিফলন একটি খুব শক্তিশালী হাতিয়ার!