Reflection API হল Java এর একটি শক্তিশালী বৈশিষ্ট্য, যা ক্লাস, মেথড, ফিল্ড এবং কনস্ট্রাক্টর সম্পর্কিত তথ্য runtime-এ অ্যাক্সেস করতে সহায়ক। Java Bean-এর সাথে Reflection API ব্যবহৃত হলে, আপনি ডায়নামিকভাবে Java Beans এর প্রপার্টি অ্যাক্সেস বা সেট করতে পারবেন, নতুন Bean তৈরি করতে পারবেন, অথবা Bean এর মেথড বা ফিল্ডগুলির উপর কাজ করতে পারবেন।
এখানে Reflection API এবং Java Beans এর সাথে ব্যবহারের কিছু গুরুত্বপূর্ণ পদ্ধতি এবং উদাহরণ আলোচনা করা হবে।
১. Java Bean এর ফিল্ড বা প্রপার্টি অ্যাক্সেস এবং সেট করা
Reflection API ব্যবহার করে আপনি Java Bean-এর ফিল্ড বা প্রপার্টি অ্যাক্সেস করতে পারেন এবং তা runtime-এ পরিবর্তন (set) করতে পারেন। নিচে একটি উদাহরণ দেখানো হলো, যেখানে Java Bean-এর private ফিল্ড অ্যাক্সেস এবং সেট করা হয়েছে।
উদাহরণ: Reflection API দিয়ে Bean-এর প্রপার্টি অ্যাক্সেস এবং সেট করা
import java.lang.reflect.Field;
public class ReflectionWithBean {
public static void main(String[] args) {
try {
// Create a Person object
Person person = new Person("John", 30);
// Get the class of the object (Person)
Class<?> personClass = person.getClass();
// Access private field 'name' using reflection
Field nameField = personClass.getDeclaredField("name");
nameField.setAccessible(true); // Make the private field accessible
// Get the value of 'name' field
String name = (String) nameField.get(person);
System.out.println("Name: " + name); // Output: John
// Set a new value for 'name' field
nameField.set(person, "Alice");
// Output the updated 'name' field value
System.out.println("Updated Name: " + person.getName()); // Output: Alice
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}ব্যাখ্যা:
Personক্লাসে private ফিল্ডnameরয়েছে, যা সাধারণত getter/setter মেথডের মাধ্যমে অ্যাক্সেস করা হয়।- Reflection API ব্যবহার করে,
getDeclaredField("name")দিয়ে name ফিল্ডটি রিফ্লেক্টিভলি অ্যাক্সেস করা হয়েছে। setAccessible(true)মেথড ব্যবহার করে, private ফিল্ডটি অ্যাক্সেসযোগ্য করা হয়েছে এবংset()মেথড ব্যবহার করে ফিল্ডের মান পরিবর্তন করা হয়েছে।
২. Java Bean-এর Getter/Setter মেথডের মাধ্যমে প্রপার্টি অ্যাক্সেস
Reflection API ব্যবহার করে আপনি Java Bean এর getter এবং setter মেথড ডায়নামিকভাবে কল করতে পারেন।
উদাহরণ: Reflection API দিয়ে Bean-এর Getter/Setter মেথড কল করা
import java.lang.reflect.Method;
public class ReflectionWithGetterSetter {
public static void main(String[] args) {
try {
// Create a Person object
Person person = new Person("John", 30);
// Get the class of the object (Person)
Class<?> personClass = person.getClass();
// Access the 'getName' method
Method getNameMethod = personClass.getMethod("getName");
String name = (String) getNameMethod.invoke(person);
System.out.println("Name: " + name); // Output: John
// Access the 'setName' method and set a new value for 'name'
Method setNameMethod = personClass.getMethod("setName", String.class);
setNameMethod.invoke(person, "Alice");
// Output the updated name using 'getName'
name = (String) getNameMethod.invoke(person);
System.out.println("Updated Name: " + name); // Output: Alice
} catch (Exception e) {
e.printStackTrace();
}
}
}ব্যাখ্যা:
- Reflection API ব্যবহার করে
getMethod("getName")এবংgetMethod("setName", String.class)মেথডগুলি রিফ্লেক্টিভলি অ্যাক্সেস করা হয়েছে। invoke()মেথডের মাধ্যমে ডায়নামিকভাবে getter এবং setter মেথড কল করা হয়েছে।
৩. Runtime-এ Bean তৈরি করা (Dynamic Bean Creation)
Reflection API ব্যবহার করে আপনি একটি runtime-এ Java Bean তৈরি করতে পারেন, যেখানে ক্লাস এবং কনস্ট্রাক্টরের নাম জানলেও Bean ইনস্ট্যান্স তৈরি করা সম্ভব হয়।
উদাহরণ: Runtime Bean Creation using Reflection API
import java.lang.reflect.Constructor;
public class DynamicBeanCreation {
public static void main(String[] args) {
try {
// Dynamically create Person class object using reflection
Class<?> personClass = Class.forName("Person");
Constructor<?> constructor = personClass.getConstructor(String.class, int.class);
// Create a Person object dynamically
Object person = constructor.newInstance("Alice", 25);
// Output the dynamically created object data using reflection
System.out.println("Name: " + personClass.getMethod("getName").invoke(person)); // Output: Alice
System.out.println("Age: " + personClass.getMethod("getAge").invoke(person)); // Output: 25
} catch (Exception e) {
e.printStackTrace();
}
}
}ব্যাখ্যা:
- Reflection API এর মাধ্যমে
Personক্লাস ডায়নামিকভাবে লোড করা হয়েছে এবংgetConstructor()মেথড দিয়ে কনস্ট্রাক্টর অবজেক্ট তৈরি করা হয়েছে। newInstance()মেথড ব্যবহার করে Person অবজেক্ট runtime-এ তৈরি করা হয়েছে এবং getter মেথডের মাধ্যমে ডেটা অ্যাক্সেস করা হয়েছে।
৪. Dynamic Property Setting using Reflection
আপনি Reflection API ব্যবহার করে runtime-এ Java Bean এর প্রপার্টি সেট করতে পারেন।
উদাহরণ: Reflection API দিয়ে প্রপার্টি সেট করা
import java.lang.reflect.Method;
public class DynamicPropertySetting {
public static void main(String[] args) {
try {
// Create a Person object
Person person = new Person("John", 30);
// Get the 'setName' method dynamically
Method setNameMethod = person.getClass().getMethod("setName", String.class);
setNameMethod.invoke(person, "Alice");
// Get the updated name using 'getName'
Method getNameMethod = person.getClass().getMethod("getName");
System.out.println("Updated Name: " + getNameMethod.invoke(person)); // Output: Alice
} catch (Exception e) {
e.printStackTrace();
}
}
}ব্যাখ্যা:
- Reflection API ব্যবহার করে,
setNameমেথড ডায়নামিকভাবে কল করা হয়েছে, যার মাধ্যমে Person অবজেক্টের নাম পরিবর্তন করা হয়েছে।
সারাংশ
- Reflection API Java Bean-এ প্রপার্টি অ্যাক্সেস, সেট এবং getter/setter মেথড কল করার জন্য একটি শক্তিশালী টুল।
- আপনি runtime-এ Bean তৈরি এবং Bean-এর ফিল্ড বা প্রপার্টি অ্যাক্সেস করতে Reflection API ব্যবহার করতে পারেন।
- Reflection API এর মাধ্যমে dynamic property setting, getter/setter method invocation, এবং runtime bean creation করা সম্ভব, যা উন্নত ডাইনামিক প্রোগ্রামিং এবং ফ্লেক্সিবল অ্যাপ্লিকেশন তৈরিতে সহায়তা করে।
Reflection API ব্যবহার করা হলে, তবে কোডের পারফরম্যান্স কিছুটা কমে যেতে পারে, তাই প্রয়োজনের ভিত্তিতে এর ব্যবহার সীমিত রাখাটা ভালো।
Read more