Runtime এ Bean Properties Access করা

Reflection API এবং BeanUtils (রিফ্লেকশন এপিআই এবং বিনইউটিলস) - জাভা বীনইউটিলস (Java BeanUtils) - Computer Programming

362

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

ব্যাখ্যা:

  1. BeanUtils.setProperty(): ডাইনামিকভাবে Bean এর প্রপার্টিতে মান সেট করা হয়েছে।
  2. 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();
        }
    }
}

ব্যাখ্যা:

  1. PropertyUtils.setProperty(): প্রপার্টি সেট করার সময় টাইপ কনভার্সন করা হয়নি।
  2. 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;
    }
}

ব্যাখ্যা:

  1. Reflection API: প্রাইভেট ফিল্ডগুলো Access এবং মান সেট করা হয়েছে।
  2. 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 St

6. BeanUtils বনাম PropertyUtils

বৈশিষ্ট্যBeanUtilsPropertyUtils
টাইপ কনভার্সনটাইপ কনভার্সন স্বয়ংক্রিয়ভাবে করা হয়।টাইপ কনভার্সন সাপোর্ট করে না।
Nested Propertiesসরাসরি Nested Properties Access করা যায় না।সরাসরি Nested Properties Access করা যায়।
Performanceতুলনামূলক ধীর (টাইপ কনভার্সনের কারণে)।তুলনামূলক দ্রুত।

সারাংশ

  • BeanUtils এবং PropertyUtils ব্যবহার করে runtime-এ Bean প্রপার্টি Access এবং Manipulate করা সহজ।
  • Reflection API ডাইনামিক এবং লো-লেভেল Bean Access এর জন্য কার্যকর।
  • Nested Properties Access করার জন্য PropertyUtils সেরা পছন্দ।

আপনার কাজের ধরন অনুযায়ী সঠিক টুল বা লাইব্রেরি ব্যবহার করুন।

Content added || updated By
Promotion

Are you sure to start over?

Loading...