Java Reflection এর মাধ্যমে আপনি ক্লাসের ফিল্ড বা ভেরিয়েবলগুলোর মান পড়তে এবং পরিবর্তন করতে পারেন, এমনকি তারা প্রাইভেট (private) বা প্রটেকটেড (protected) হলেও। এটি খুবই শক্তিশালী একটি বৈশিষ্ট্য, তবে এটি ব্যবহার করার সময় সাবধানতা অবলম্বন করা উচিত, কারণ এর মাধ্যমে ক্লাসের এনক্যাপসুলেশন ভঙ্গ হয় এবং সিকিউরিটি ঝুঁকি তৈরি হতে পারে।
Field ক্লাস
Field ক্লাসটি java.lang.reflect প্যাকেজে অন্তর্ভুক্ত, এবং এটি ক্লাসের ফিল্ডগুলোকে প্রোগ্রামmatically অ্যাক্সেস এবং ম্যানিপুলেট করতে ব্যবহৃত হয়। আপনি Field ক্লাসের সাহায্যে ফিল্ডের মান সংগ্রহ (get()) এবং পরিবর্তন (set()) করতে পারেন।
Field.get() এবং Field.set() এর ব্যবহার
get()মেথড:Field.get(Object obj)মেথডটি একটি নির্দিষ্ট অবজেক্টের ফিল্ডের মান রিটার্ন করে।- এটি যদি প্রাইভেট বা প্রোটেকটেড ফিল্ড হয়, তবে
setAccessible(true)মেথডটি ব্যবহার করতে হয় যাতে ফিল্ডটি অ্যাক্সেস করা যায়।
সিনট্যাক্স:
Object get(Object obj) throws IllegalAccessExceptionব্যবহার:
get()মেথডটি ব্যবহৃত হয় ফিল্ডের মান বের করার জন্য।
set()মেথড:Field.set(Object obj, Object value)মেথডটি একটি নির্দিষ্ট অবজেক্টের ফিল্ডে একটি নতুন মান সেট করে।- এটি ফিল্ডের ধরণের সাথে মেলে এমন মান দিতে হবে। যদি না হয়, তবে
IllegalArgumentExceptionএরর উঠবে।
সিনট্যাক্স:
void set(Object obj, Object value) throws IllegalAccessExceptionব্যবহার:
set()মেথডটি ব্যবহৃত হয় ফিল্ডের মান পরিবর্তন করার জন্য।
উদাহরণ: Field.get() এবং Field.set() ব্যবহার
ধরা যাক, একটি Person নামক ক্লাস রয়েছে, যেখানে একটি প্রাইভেট ফিল্ড name রয়েছে এবং আমরা রিফ্লেকশন ব্যবহার করে তার মান পরিবর্তন এবং পড়তে চাই।
import java.lang.reflect.Field;
class Person {
private String name;
public Person(String name) {
this.name = name;
}
public void display() {
System.out.println("Name: " + name);
}
}
public class ReflectionExample {
public static void main(String[] args) throws Exception {
// Person ক্লাসের একটি অবজেক্ট তৈরি
Person person = new Person("John Doe");
// রিফ্লেকশন ব্যবহার করে Person ক্লাসের 'name' ফিল্ড অ্যাক্সেস করা
Class<?> cls = person.getClass();
// 'name' ফিল্ডটি পেতে
Field field = cls.getDeclaredField("name");
// প্রাইভেট ফিল্ড অ্যাক্সেস করার জন্য setAccessible(true) ব্যবহার করা
field.setAccessible(true);
// ফিল্ডের মান পড়া (get)
String currentName = (String) field.get(person);
System.out.println("Current Name: " + currentName); // Output: John Doe
// ফিল্ডে নতুন মান সেট করা (set)
field.set(person, "Jane Smith");
// ফিল্ডের নতুন মান পড়া (get)
String updatedName = (String) field.get(person);
System.out.println("Updated Name: " + updatedName); // Output: Jane Smith
// অবজেক্টে display() মেথড কল করা
person.display(); // Output: Name: Jane Smith
}
}
উপরে উল্লেখিত কোডের ব্যাখ্যা:
Personক্লাস: এতে একটি প্রাইভেটnameফিল্ড এবং একটি কন্সট্রাক্টর রয়েছে যাnameইনিশিয়ালাইজ করে।Field.getDeclaredField("name"): এই মেথডটিPersonক্লাসেরnameফিল্ডের রিফ্লেকশন অবজেক্ট ফেরত দেয়।field.setAccessible(true): এই মেথডটিnameফিল্ডটি প্রাইভেট হওয়া সত্ত্বেও অ্যাক্সেস করতে সাহায্য করে।field.get(person):personঅবজেক্টেরnameফিল্ডের মান নেয় এবং এটি আউটপুট করে।field.set(person, "Jane Smith"):personঅবজেক্টেরnameফিল্ডের মান পরিবর্তন করে"Jane Smith"দিয়ে সেট করা হয়।
রিফ্লেকশন ব্যবহারের কিছু গুরুত্বপূর্ণ পয়েন্ট:
- ফিল্ডের অ্যাক্সেস: যদি ফিল্ডটি প্রাইভেট হয়, তবে
setAccessible(true)ব্যবহার করা প্রয়োজন। - টাইপ কাস্টিং:
get()এবংset()মেথডের মাধ্যমে আপনি অবজেক্ট অ্যাক্সেস করছেন, তাইget()মেথডের ফলাফল প্রপার টাইপে কাস্ট করতে হবে। - এলার্জিক এক্সেপশন:
IllegalAccessExceptionফেলে দিতে পারে যদি ফিল্ডটি অ্যাক্সেসযোগ্য না হয়।
Field.get() এবং Field.set() জাভা রিফ্লেকশন প্যাকেজের গুরুত্বপূর্ণ মেথড যা আপনাকে ক্লাসের ফিল্ডের মান পড়তে এবং পরিবর্তন করতে সাহায্য করে। এটি ডাইনামিক কোড এক্সিকিউশনের জন্য খুবই কার্যকর, তবে এর মাধ্যমে কোডের এনক্যাপসুলেশন ভঙ্গ হতে পারে, তাই সাবধানে ব্যবহার করা উচিত।
Read more