Runtime-এ Bean-এর প্রপার্টি Access এবং Manipulate করা অনেক সময় প্রয়োজন হয়, বিশেষত যখন Bean-এর প্রপার্টিগুলো আগে থেকে জানা থাকে না বা ডায়নামিকভাবে প্রোসেস করতে হয়। Apache Commons BeanUtils এবং Reflection API-এর সাহায্যে এই কাজ সহজে করা যায়।
1. Bean Properties Access করার উপায়
BeanUtils:
BeanUtils.getProperty() এবং BeanUtils.setProperty() মেথড ব্যবহার করে Bean-এর প্রপার্টি runtime-এ Access এবং Manipulate করা যায়।
PropertyUtils:
PropertyUtils.getProperty() এবং PropertyUtils.setProperty() টাইপ কনভার্সন ছাড়া প্রপার্টি Access এবং Manipulate করতে ব্যবহার করা হয়।
Reflection API:
Java Reflection API ব্যবহার করে Bean-এর ফিল্ড এবং মেথড Access করা যায়।
2. উদাহরণ: BeanUtils দিয়ে Runtime Properties Access এবং Manipulate
import org.apache.commons.beanutils.BeanUtils;
public class RuntimePropertyAccessWithBeanUtils {
public static void main(String[] args) {
try {
// Create a Bean instance
Person person = new Person();
// Set properties dynamically
BeanUtils.setProperty(person, "name", "John Doe");
BeanUtils.setProperty(person, "age", "30"); // Automatic type conversion
// Get properties dynamically
String name = BeanUtils.getProperty(person, "name");
String age = BeanUtils.getProperty(person, "age");
// Print properties
System.out.println("Name: " + name); // Output: John Doe
System.out.println("Age: " + age); // Output: 30
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Person {
private String name;
private int age;
// Getters and Setters
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;
}
}ব্যাখ্যা:
- BeanUtils.setProperty(): ডাইনামিকভাবে Bean এর প্রপার্টিতে মান সেট করা হয়েছে।
- BeanUtils.getProperty(): প্রপার্টির মান পড়া হয়েছে।
3. উদাহরণ: PropertyUtils দিয়ে Runtime Properties Access
import org.apache.commons.beanutils.PropertyUtils;
public class RuntimePropertyAccessWithPropertyUtils {
public static void main(String[] args) {
try {
// Create a Bean instance
Person person = new Person();
// Set properties dynamically
PropertyUtils.setProperty(person, "name", "Jane Doe");
PropertyUtils.setProperty(person, "age", 25);
// Get properties dynamically
String name = (String) PropertyUtils.getProperty(person, "name");
int age = (int) PropertyUtils.getProperty(person, "age");
// Print properties
System.out.println("Name: " + name); // Output: Jane Doe
System.out.println("Age: " + age); // Output: 25
} catch (Exception e) {
e.printStackTrace();
}
}
}ব্যাখ্যা:
- PropertyUtils.setProperty(): প্রপার্টি সেট করার সময় টাইপ কনভার্সন করা হয়নি।
- PropertyUtils.getProperty(): টাইপ কনভার্সন ছাড়াই প্রপার্টি মান পড়া হয়েছে।
4. উদাহরণ: Reflection API দিয়ে Runtime Properties Access
import java.lang.reflect.Field;
public class RuntimePropertyAccessWithReflection {
public static void main(String[] args) {
try {
// Create a Bean instance
Person person = new Person();
// Access private field using Reflection
Field nameField = Person.class.getDeclaredField("name");
nameField.setAccessible(true); // Make private field accessible
nameField.set(person, "Reflection User");
Field ageField = Person.class.getDeclaredField("age");
ageField.setAccessible(true);
ageField.set(person, 35);
// Get the field values
String name = (String) nameField.get(person);
int age = (int) ageField.get(person);
// Print properties
System.out.println("Name: " + name); // Output: Reflection User
System.out.println("Age: " + age); // Output: 35
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Person {
private String name;
private int age;
// Getters and Setters
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;
}
}ব্যাখ্যা:
- Reflection API: প্রাইভেট ফিল্ডগুলো Access এবং মান সেট করা হয়েছে।
- Field.setAccessible(): প্রাইভেট ফিল্ডগুলোকে Public ভাবে Access করতে ব্যবহার করা হয়েছে।
5. Nested Properties Access
BeanUtils এবং PropertyUtils ব্যবহার করে Nested Properties Access এবং Manipulate করা যায়।
Nested Property Access উদাহরণ
import org.apache.commons.beanutils.PropertyUtils;
public class NestedPropertyAccess {
public static void main(String[] args) {
try {
// Create Nested Beans
Address address = new Address("123 Main St", "City A");
Person person = new Person("Nested User", 40, address);
// Access nested properties
String street = (String) PropertyUtils.getNestedProperty(person, "address.street");
String city = (String) PropertyUtils.getNestedProperty(person, "address.city");
// Modify nested properties
PropertyUtils.setNestedProperty(person, "address.street", "456 Elm St");
// Print properties
System.out.println("Street: " + street); // Output: 123 Main St
System.out.println("City: " + city); // Output: City A
System.out.println("Updated Street: " + person.getAddress().getStreet()); // Output: 456 Elm St
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Address {
private String street;
private String city;
public Address(String street, String city) {
this.street = street;
this.city = city;
}
// Getters and Setters
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
}
class Person {
private String name;
private int age;
private Address address;
public Person(String name, int age, Address address) {
this.name = name;
this.age = age;
this.address = address;
}
public Person() {}
// Getters and Setters
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;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}আউটপুট:
Street: 123 Main St
City: City A
Updated Street: 456 Elm St6. BeanUtils বনাম PropertyUtils
| বৈশিষ্ট্য | BeanUtils | PropertyUtils |
|---|---|---|
| টাইপ কনভার্সন | টাইপ কনভার্সন স্বয়ংক্রিয়ভাবে করা হয়। | টাইপ কনভার্সন সাপোর্ট করে না। |
| Nested Properties | সরাসরি Nested Properties Access করা যায় না। | সরাসরি Nested Properties Access করা যায়। |
| Performance | তুলনামূলক ধীর (টাইপ কনভার্সনের কারণে)। | তুলনামূলক দ্রুত। |
সারাংশ
- BeanUtils এবং PropertyUtils ব্যবহার করে runtime-এ Bean প্রপার্টি Access এবং Manipulate করা সহজ।
- Reflection API ডাইনামিক এবং লো-লেভেল Bean Access এর জন্য কার্যকর।
- Nested Properties Access করার জন্য PropertyUtils সেরা পছন্দ।
আপনার কাজের ধরন অনুযায়ী সঠিক টুল বা লাইব্রেরি ব্যবহার করুন।
Read more