Bean Property Access (বিন প্রপার্টি অ্যাক্সেস)

জাভা বীনইউটিলস (Java BeanUtils) - Computer Programming

275

Bean Property Access হল Java Bean এর প্রপার্টির মান অ্যাক্সেস করার প্রক্রিয়া। Java Beans হল এমন ক্লাস যার মধ্যে সাধারণত private fields (প্রপার্টি) থাকে এবং সেগুলোর মান অ্যাক্সেস বা সেট করার জন্য getter/setter মেথড ব্যবহৃত হয়। তবে, Apache Commons BeanUtils লাইব্রেরি PropertyUtils ব্যবহার করে Bean-এর প্রপার্টি অ্যাক্সেস করার একটি সহজ পদ্ধতি প্রদান করে, যা সরাসরি getter/setter মেথড ব্যবহার না করেও Bean-এর প্রপার্টি অ্যাক্সেস করতে সহায়তা করে।

Property Access Using BeanUtils (বিন প্রপার্টি অ্যাক্সেস BeanUtils ব্যবহার করে)

Apache Commons BeanUtils এর PropertyUtils ক্লাস আপনাকে Java Bean এর প্রপার্টি অ্যাক্সেস করতে সাহায্য করে। এটি reflection ব্যবহার করে getter এবং setter মেথড ছাড়াই Java Bean-এর প্রপার্টির মান পড়তে বা সেট করতে পারে।


1. PropertyUtils.getProperty()

PropertyUtils.getProperty() মেথড একটি Java Bean-এর নির্দিষ্ট প্রপার্টির মান অ্যাক্সেস করতে ব্যবহৃত হয়। এই মেথডটি সরাসরি Bean এর getter মেথড ব্যবহার না করে প্রপার্টি মান রিট্রিভ করে।

উদাহরণ:

ধরা যাক, আমাদের একটি Person Bean রয়েছে, যার name এবং age নামক প্রপার্টি রয়েছে। আমরা PropertyUtils.getProperty() ব্যবহার করে প্রপার্টির মান অ্যাক্সেস করব।

import org.apache.commons.beanutils.PropertyUtils;

public class Main {
    public static void main(String[] args) throws Exception {
        // Create a Person object
        Person person = new Person("Alice", 30);

        // Access the properties using PropertyUtils
        String name = (String) PropertyUtils.getProperty(person, "name");
        int age = (int) PropertyUtils.getProperty(person, "age");

        // Print the accessed properties
        System.out.println("Name: " + name);  // Output: Alice
        System.out.println("Age: " + age);    // Output: 30
    }
}

class Person {
    private String name;
    private int age;

    // Constructor
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Getter and Setter methods
    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;
    }
}

এখানে, PropertyUtils.getProperty() মেথডের মাধ্যমে আমরা Person Bean-এর name এবং age প্রপার্টি অ্যাক্সেস করছি।

আউটপুট:

Name: Alice
Age: 30

2. PropertyUtils.setProperty()

PropertyUtils.setProperty() মেথড ব্যবহার করে আমরা Java Bean এর প্রপার্টির মান সেট করতে পারি, যেখানে setter মেথড না ব্যবহার করেও এই কাজ করা সম্ভব।

উদাহরণ:

ধরা যাক, আমরা একটি Person Bean-এর name এবং age প্রপার্টির মান সেট করতে চাই। PropertyUtils.setProperty() ব্যবহার করে এটি করতে পারি।

import org.apache.commons.beanutils.PropertyUtils;

public class Main {
    public static void main(String[] args) throws Exception {
        // Create a Person object
        Person person = new Person("John", 25);

        // Set the properties using PropertyUtils
        PropertyUtils.setProperty(person, "name", "Alice");
        PropertyUtils.setProperty(person, "age", 30);

        // Print the updated properties
        System.out.println("Updated Name: " + person.getName());  // Output: Alice
        System.out.println("Updated Age: " + person.getAge());    // Output: 30
    }
}

class Person {
    private String name;
    private int age;

    // Constructor
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Getter and Setter methods
    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;
    }
}

এখানে, PropertyUtils.setProperty() মেথড ব্যবহার করে আমরা name এবং age প্রপার্টি সেট করেছি। এটি সরাসরি setter মেথড ব্যবহার না করেও কাজ করেছে।

আউটপুট:

Updated Name: Alice
Updated Age: 30

3. PropertyUtils for Nested Properties (নেস্টেড প্রপার্টি অ্যাক্সেস)

PropertyUtils নেস্টেড প্রপার্টি অ্যাক্সেস এবং সেট করার জন্যও ব্যবহৃত হতে পারে। উদাহরণস্বরূপ, যদি একটি Java Bean-এর মধ্যে অন্য একটি Bean থাকে, তাহলে আমরা সেই nested Bean-এর প্রপার্টি অ্যাক্সেস করতে পারব।

উদাহরণ:

ধরা যাক, আমাদের একটি Department Bean রয়েছে, যার মধ্যে Employee Bean রয়েছে। আমরা Employee Bean-এর প্রপার্টি অ্যাক্সেস করতে চাই।

import org.apache.commons.beanutils.PropertyUtils;

public class Main {
    public static void main(String[] args) throws Exception {
        // Create an Employee object
        Employee employee = new Employee("John", 28);
        
        // Create a Department object with the Employee object inside
        Department department = new Department(employee);

        // Access nested properties using PropertyUtils
        String name = (String) PropertyUtils.getProperty(department, "employee.name");
        int age = (int) PropertyUtils.getProperty(department, "employee.age");

        // Print the nested properties
        System.out.println("Employee Name: " + name);  // Output: John
        System.out.println("Employee Age: " + age);    // Output: 28
    }
}

class Employee {
    private String name;
    private int age;

    // Constructor
    public Employee(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Getter and Setter methods
    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;
    }
}

class Department {
    private Employee employee;

    // Constructor
    public Department(Employee employee) {
        this.employee = employee;
    }

    // Getter and Setter methods
    public Employee getEmployee() {
        return employee;
    }

    public void setEmployee(Employee employee) {
        this.employee = employee;
    }
}

এখানে, PropertyUtils.getProperty() ব্যবহার করে Department Bean-এর মধ্যে থাকা Employee Bean-এর প্রপার্টি (name এবং age) অ্যাক্সেস করা হচ্ছে।

আউটপুট:

Employee Name: John
Employee Age: 28

4. Exception Handling (এক্সসেপশন হ্যান্ডলিং)

PropertyUtils ব্যবহার করার সময় কিছু এক্সসেপশন আসতে পারে:

  • IllegalAccessException: যদি Bean-এর প্রপার্টি private থাকে এবং getter/setter না থাকে।
  • InvocationTargetException: যদি getter/setter মেথডে কোনো সমস্যা থাকে।
  • NoSuchMethodException: যদি প্রপার্টির জন্য getter/setter মেথড না থাকে।

এছাড়া, PropertyUtils Reflection ব্যবহার করে কাজ করার কারণে performance কিছুটা কম হতে পারে।


সারাংশ

  • PropertyUtils লাইব্রেরি getter এবং setter মেথড ছাড়াও Java Bean-এর প্রপার্টি অ্যাক্সেস এবং সেট করার সুবিধা প্রদান করে।
  • এটি nested properties এর অ্যাক্সেস এবং সেট করার জন্যও খুবই কার্যকরী।
  • PropertyUtils.getProperty() এবং PropertyUtils.setProperty() মেথড ব্যবহার করে Java Beans-এর প্রপার্টি রিড এবং রাইট করা যায়।

এটি Java Beans-এর প্রপার্টি ম্যানিপুলেশন সহজ এবং দ্রুত করার জন্য একটি শক্তিশালী টুল।

Content added || updated By

Java Bean হল একটি বিশেষ ধরনের ক্লাস যা সাধারণত ডেটা এনক্যাপসুলেশন, ডেটা প্রক্রিয়াকরণ এবং অবজেক্ট পাসিংয়ের জন্য ব্যবহৃত হয়। Java Bean-এ private fields (প্রপার্টি) থাকে এবং সেগুলির gettersetter মেথডের মাধ্যমে অ্যাক্সেস এবং ম্যানিপুলেশন করা হয়। এর মাধ্যমে কোডের নিরাপত্তা এবং স্থিরতা নিশ্চিত করা যায়।

1. Bean এর প্রপার্টি অ্যাক্সেস (Accessing Bean Properties)

Java Bean-এ সাধারণত private fields বা প্রপার্টি থাকে। এই প্রপার্টিগুলিকে অ্যাক্সেস করার জন্য getter মেথড ব্যবহার করা হয় এবং setter মেথড ব্যবহার করে তাদের মান পরিবর্তন (manipulate) করা হয়।

উদাহরণ:

public class Person {
    private String name;
    private int age;

    // Constructor
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Getter method for name
    public String getName() {
        return name;
    }

    // Setter method for name
    public void setName(String name) {
        this.name = name;
    }

    // Getter method for age
    public int getAge() {
        return age;
    }

    // Setter method for age
    public void setAge(int age) {
        this.age = age;
    }
}

ব্যাখ্যা:

  1. private fields: name এবং age ফিল্ড দুটি Person ক্লাসে প্রাইভেট হিসেবে ঘোষণা করা হয়েছে, যা বাইরের ক্লাস থেকে সরাসরি অ্যাক্সেস করা যাবে না।
  2. getter মেথড: getName() এবং getAge() মেথডগুলো name এবং age ফিল্ডগুলোর মান অ্যাক্সেস করার জন্য ব্যবহৃত হয়।
  3. setter মেথড: setName() এবং setAge() মেথডগুলো name এবং age ফিল্ডগুলোর মান সেট করার জন্য ব্যবহৃত হয়।

2. Bean Properties এর Manipulation (মান পরিবর্তন)

Java Bean-এ প্রপার্টি ম্যানিপুলেট (manipulate) করার জন্য setter মেথড ব্যবহার করা হয়। setter মেথডের মাধ্যমে Bean-এর প্রপার্টির মান পরিবর্তন করা যায়।

উদাহরণ:

public class BeanManipulationExample {
    public static void main(String[] args) {
        // Create a new Person object
        Person person = new Person("John", 30);
        
        // Access properties using getter methods
        System.out.println("Before Manipulation:");
        System.out.println("Name: " + person.getName()); // Output: John
        System.out.println("Age: " + person.getAge());   // Output: 30
        
        // Manipulate properties using setter methods
        person.setName("Alice");
        person.setAge(25);

        // Access the manipulated properties
        System.out.println("\nAfter Manipulation:");
        System.out.println("Name: " + person.getName()); // Output: Alice
        System.out.println("Age: " + person.getAge());   // Output: 25
    }
}

ব্যাখ্যা:

  • Before Manipulation: getName() এবং getAge() মেথড ব্যবহার করে person অবজেক্টের প্রপার্টি অ্যাক্সেস করা হয়েছে।
  • After Manipulation: setName() এবং setAge() মেথড ব্যবহার করে person অবজেক্টের প্রপার্টি পরিবর্তন (manipulate) করা হয়েছে।

3. Bean Properties এর Manipulation using BeanUtils

Apache Commons BeanUtils লাইব্রেরি ব্যবহার করে Bean-এর প্রপার্টি অ্যাক্সেস এবং ম্যানিপুলেশন করা সহজ হয়। BeanUtils.copyProperties() মেথড ব্যবহার করে এক Bean থেকে অন্য Bean-এ প্রপার্টি কপি করতে পারি, এবং BeanUtils.setProperty() এবং BeanUtils.getProperty() মেথড ব্যবহার করে প্রপার্টি ম্যানিপুলেটও করতে পারি।

উদাহরণ: BeanUtils ব্যবহার করে Property Manipulation

import org.apache.commons.beanutils.BeanUtils;

public class BeanUtilsManipulationExample {
    public static void main(String[] args) {
        try {
            // Create a new Person object
            Person person = new Person("John", 30);
            
            // Access and manipulate properties using BeanUtils
            System.out.println("Before Manipulation:");
            System.out.println("Name: " + BeanUtils.getProperty(person, "name")); // Output: John
            System.out.println("Age: " + BeanUtils.getProperty(person, "age"));   // Output: 30
            
            // Manipulate the properties
            BeanUtils.setProperty(person, "name", "Alice");
            BeanUtils.setProperty(person, "age", 25);

            // Access the manipulated properties
            System.out.println("\nAfter Manipulation:");
            System.out.println("Name: " + BeanUtils.getProperty(person, "name")); // Output: Alice
            System.out.println("Age: " + BeanUtils.getProperty(person, "age"));   // Output: 25
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ব্যাখ্যা:

  1. BeanUtils.getProperty(): BeanUtils.getProperty(person, "name") এবং BeanUtils.getProperty(person, "age") ব্যবহার করে Bean-এর প্রপার্টি অ্যাক্সেস করা হয়েছে।
  2. BeanUtils.setProperty(): BeanUtils.setProperty(person, "name", "Alice") এবং BeanUtils.setProperty(person, "age", 25) ব্যবহার করে name এবং age প্রপার্টি পরিবর্তন (manipulate) করা হয়েছে।

4. Bean-এর Nested Properties Access এবং Manipulation

Java Bean-এ যদি nested properties থাকে, যেমন একটি Bean এর মধ্যে আরেকটি Bean থাকে, তবে BeanUtils এর মাধ্যমে সেই nested properties অ্যাক্সেস এবং ম্যানিপুলেট করা সম্ভব।

উদাহরণ: Nested Properties Access and Manipulation using BeanUtils

import org.apache.commons.beanutils.BeanUtils;

public class NestedBeanExample {
    public static void main(String[] args) {
        try {
            // Create Address object
            Address address = new Address("Street 123", "City A");
            
            // Create Person object with nested Address object
            Person person = new Person("John", 30, address);
            
            // Access nested properties using BeanUtils
            System.out.println("Before Manipulation:");
            System.out.println("Street: " + BeanUtils.getProperty(person, "address.street")); // Output: Street 123
            System.out.println("City: " + BeanUtils.getProperty(person, "address.city"));   // Output: City A
            
            // Manipulate nested properties using BeanUtils
            BeanUtils.setProperty(person, "address.street", "Street 456");
            BeanUtils.setProperty(person, "address.city", "City B");

            // Access manipulated nested properties
            System.out.println("\nAfter Manipulation:");
            System.out.println("Street: " + BeanUtils.getProperty(person, "address.street")); // Output: Street 456
            System.out.println("City: " + BeanUtils.getProperty(person, "address.city"));   // Output: City B
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class Person {
    private String name;
    private int age;
    private Address address;

    public Person() {}

    public Person(String name, int age, Address address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    // Getter and setter methods
    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;
    }
}

class Address {
    private String street;
    private String city;

    public Address(String street, String city) {
        this.street = street;
        this.city = city;
    }

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

ব্যাখ্যা:

  1. Nested Bean: এখানে Person ক্লাসের মধ্যে Address ক্লাস রয়েছে। BeanUtils.getProperty() এবং BeanUtils.setProperty() ব্যবহার করে nested address.street এবং address.city প্রপার্টি অ্যাক্সেস এবং ম্যানিপুলেট করা হয়েছে।
  2. Nested Properties Access and Manipulation: address.street এবং address.city কে BeanUtils এর মাধ্যমে অ্যাক্সেস এবং পরিবর্তন করা হয়েছে।

সারাংশ

  • Java Bean এর প্রপার্টি অ্যাক্স

েস এবং ম্যানিপুলেশন করার জন্য getter/setter মেথড ব্যবহার করা হয়।

  • Apache Commons BeanUtils ব্যবহার করে Bean-এ প্রপার্টি কপি করা, টাইপ কনভার্সন করা এবং nested properties ম্যানিপুলেট করা সহজ হয়।
  • BeanUtils.populate() এবং BeanUtils.copyProperties() মেথড ব্যবহার করে সহজভাবে ডেটা ট্রান্সফার এবং ম্যানিপুলেশন করা যায়।

এভাবে Java Bean-এর প্রপার্টি অ্যাক্সেস এবং ম্যানিপুলেশন করা যায়, যা কোডকে আরও পরিষ্কার এবং সঠিকভাবে পরিচালিত করতে সাহায্য করে।

Content added || updated By

Java Bean-এ Nested Properties এবং Indexed Properties ব্যবহার করে জটিল ডেটা ম্যানিপুলেশন সহজ করা যায়। Apache Commons BeanUtils লাইব্রেরি এই কাজগুলো করার জন্য সরঞ্জাম সরবরাহ করে।


1. Nested Properties

Nested Properties এমন প্রপার্টি যা একটি Bean-এর মধ্যে অন্য Bean ধারণ করে। উদাহরণস্বরূপ, যদি Person ক্লাসে একটি Address অবজেক্ট থাকে, তাহলে এটি একটি Nested Property।

উদাহরণ: Nested Properties ব্যবহার

import org.apache.commons.beanutils.PropertyUtils;

public class NestedPropertiesExample {
    public static void main(String[] args) {
        try {
            // Nested Property Example
            Address address = new Address("Street 123", "City A");
            Person person = new Person("John", 30, address);

            // Access Nested Properties
            String street = (String) PropertyUtils.getProperty(person, "address.street");
            String city = (String) PropertyUtils.getProperty(person, "address.city");

            // Modify Nested Properties
            PropertyUtils.setProperty(person, "address.street", "New Street 456");

            // Output
            System.out.println("Street: " + street);          // Output: Street 123
            System.out.println("City: " + city);              // Output: City A
            System.out.println("Updated Street: " + person.getAddress().getStreet()); // Output: New Street 456
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

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

    // Getter and Setter Methods
    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;
    }
}

class Address {
    private String street;
    private String city;

    public Address(String street, String city) {
        this.street = street;
        this.city = city;
    }

    // Getter and Setter Methods
    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;
    }
}

ব্যাখ্যা:

  1. PropertyUtils.getProperty() ব্যবহার করে address.street এবং address.city অ্যাক্সেস করা হয়েছে।
  2. PropertyUtils.setProperty() ব্যবহার করে address.street পরিবর্তন করা হয়েছে।

2. Indexed Properties

Indexed Properties হল Bean-এর মধ্যে Array বা List টাইপের প্রপার্টি। এটি Array/List-এর নির্দিষ্ট ইনডেক্সের মান অ্যাক্সেস বা পরিবর্তন করতে ব্যবহৃত হয়।

উদাহরণ: Indexed Properties ব্যবহার

import org.apache.commons.beanutils.PropertyUtils;
import java.util.ArrayList;
import java.util.List;

public class IndexedPropertiesExample {
    public static void main(String[] args) {
        try {
            // Indexed Property Example
            Person person = new Person("John", 30);

            // Add phone numbers to the list
            List<String> phoneNumbers = new ArrayList<>();
            phoneNumbers.add("123456789");
            phoneNumbers.add("987654321");
            person.setPhoneNumbers(phoneNumbers);

            // Access Indexed Properties
            String firstPhone = (String) PropertyUtils.getIndexedProperty(person, "phoneNumbers[0]");
            String secondPhone = (String) PropertyUtils.getIndexedProperty(person, "phoneNumbers[1]");

            // Modify Indexed Properties
            PropertyUtils.setIndexedProperty(person, "phoneNumbers[0]", "111111111");

            // Output
            System.out.println("First Phone: " + firstPhone);              // Output: 123456789
            System.out.println("Second Phone: " + secondPhone);            // Output: 987654321
            System.out.println("Updated First Phone: " + person.getPhoneNumbers().get(0)); // Output: 111111111
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class Person {
    private String name;
    private int age;
    private List<String> phoneNumbers;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
        this.phoneNumbers = new ArrayList<>();
    }

    // Getter and Setter Methods
    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 List<String> getPhoneNumbers() {
        return phoneNumbers;
    }

    public void setPhoneNumbers(List<String> phoneNumbers) {
        this.phoneNumbers = phoneNumbers;
    }
}

ব্যাখ্যা:

  1. PropertyUtils.getIndexedProperty() ব্যবহার করে phoneNumbers[0] এবং phoneNumbers[1] অ্যাক্সেস করা হয়েছে।
  2. PropertyUtils.setIndexedProperty() ব্যবহার করে phoneNumbers[0] এর মান পরিবর্তন করা হয়েছে।

Nested এবং Indexed Properties এর পার্থক্য

বৈশিষ্ট্যNested PropertiesIndexed Properties
ডেটা টাইপBean বা Object-এর মধ্যে অন্য Bean বা Object।Array বা List টাইপের প্রপার্টি।
অ্যাক্সেস করার পদ্ধতিPropertyUtils.getProperty() এবং setProperty()PropertyUtils.getIndexedProperty() এবং setIndexedProperty()
ব্যবহারBean এর নেস্টেড প্রপার্টি অ্যাক্সেস বা পরিবর্তনের জন্য।Array বা List এর নির্দিষ্ট ইনডেক্স অ্যাক্সেস বা পরিবর্তনের জন্য।

সারাংশ

  • Nested Properties ব্যবহার করা হয় এক Bean এর মধ্যে থাকা অন্য Bean-এর প্রপার্টি অ্যাক্সেস বা পরিবর্তন করতে।
  • Indexed Properties ব্যবহার করা হয় Array বা List টাইপের প্রপার্টি অ্যাক্সেস বা পরিবর্তন করতে।
  • Apache Commons BeanUtils লাইব্রেরি PropertyUtils এর মাধ্যমে Nested এবং Indexed Properties সহজে হ্যান্ডল করার পদ্ধতি প্রদান করে।

উপরের উদাহরণগুলো ব্যবহার করে আপনি সহজেই Bean-এর Nested এবং Indexed Properties ম্যানিপুলেট করতে পারবেন।

Content added || updated By

Java Beans এবং সাধারণ Java ক্লাসগুলিতে প্রপার্টি অ্যাক্সেস করার জন্য getter এবং setter মেথড ব্যবহৃত হয়। Getter মেথড সাধারণত প্রপার্টি (field) এর মান রিটার্ন করে এবং Setter মেথড সেই প্রপার্টিতে নতুন মান সেট করতে ব্যবহৃত হয়। এই মেথডগুলি ডেটা এনক্যাপসুলেশন নিশ্চিত করতে সহায়ক, যাতে প্রপার্টি সরাসরি অ্যাক্সেস করা না হয়ে getter এবং setter মেথডের মাধ্যমে ডেটা পরিচালনা করা যায়।


Getter এবং Setter এর ভূমিকা:

  1. Getter মেথড:
    • এটি একটি প্রপার্টি বা ফিল্ডের মান রিটার্ন করে।
    • নামের প্রথম অক্ষর সাধারণত get দিয়ে শুরু হয় (যেমন getName(), getAge()), তবে বুলিয়ান প্রপার্টির জন্য এটি is দিয়েও শুরু হতে পারে (যেমন isActive())
  2. Setter মেথড:
    • এটি একটি প্রপার্টি বা ফিল্ডে নতুন মান সেট করে।
    • নামের প্রথম অক্ষর সাধারণত set দিয়ে শুরু হয় (যেমন setName(), setAge())

এটি একটি Encapsulation কৌশল, যেখানে প্রপার্টি সরাসরি অ্যাক্সেস না করে, শুধুমাত্র এই getter/setter মেথডের মাধ্যমে ডেটা অ্যাক্সেস এবং ম্যানিপুলেশন করা হয়।


Getter এবং Setter মেথডের উদাহরণ:

public class Person {
    private String name;
    private int age;

    // Getter for name
    public String getName() {
        return name;
    }

    // Setter for name
    public void setName(String name) {
        this.name = name;
    }

    // Getter for age
    public int getAge() {
        return age;
    }

    // Setter for age
    public void setAge(int age) {
        this.age = age;
    }
}

ব্যাখ্যা:

  1. Person ক্লাসের দুটি প্রপার্টি রয়েছে: name এবং age
  2. Getter এবং Setter মেথড ব্যবহার করে এই প্রপার্টিগুলির মান অ্যাক্সেস এবং পরিবর্তন করা হয়।

Getter এবং Setter মেথড ব্যবহার:

public class Main {
    public static void main(String[] args) {
        // Create a new Person object
        Person person = new Person();

        // Using setter methods to set properties
        person.setName("John");
        person.setAge(30);

        // Using getter methods to get properties
        System.out.println("Name: " + person.getName());  // Output: John
        System.out.println("Age: " + person.getAge());    // Output: 30
    }
}

ব্যাখ্যা:

  1. setName("John") এবং setAge(30) মেথড ব্যবহার করে Person অবজেক্টের প্রপার্টি সেট করা হয়েছে।
  2. getName() এবং getAge() মেথড ব্যবহার করে সেই প্রপার্টির মান রিটার্ন করা হয়েছে।

Getter এবং Setter এর সুবিধা:

  1. ডেটা এনক্যাপসুলেশন (Data Encapsulation):
    • প্রপার্টির অ্যাক্সেস সীমাবদ্ধ করা হয়, যাতে আপনি সরাসরি প্রপার্টি অ্যাক্সেস না করে মেথডের মাধ্যমে সেটি পরিচালনা করতে পারেন।
  2. কন্ট্রোলড ডেটা অ্যাক্সেস (Controlled Data Access):
    • আপনি setter মেথডে বৈধতা চেক করতে পারেন, যাতে ভুল ডেটা সেট না হয়।
    • getter মেথডে আপনি প্রপার্টির মান পরিবর্তন করতে পারেন, যেমন, একটি ফর্ম্যাটিং বা ক্যালকুলেশন।
  3. ভাল পারফরম্যান্স (Better Performance):
    • Getter এবং Setter ব্যবহার করে কোডের ভাল পারফরম্যান্স নিশ্চিত করা যায়, বিশেষত যখন আপনি প্রপার্টি কপি, ট্র্যাক বা লোগিং করতে চান।

Nested Properties (নেস্টেড প্রপার্টি)

Nested Properties হল একটি প্রপার্টি যার মান আরেকটি অবজেক্ট হতে পারে। অর্থাৎ, একটি Java Bean এর মধ্যে অন্য একটি Java Bean থাকতে পারে, এবং এর প্রপার্টিগুলি সরাসরি অ্যাক্সেস করা সম্ভব নয়। তবে getter এবং setter মেথড ব্যবহার করে আপনি এই nested properties-এর মান অ্যাক্সেস বা পরিবর্তন করতে পারবেন।

উদাহরণ: Nested Property Access

public class Address {
    private String street;
    private String city;

    // Constructor, getters, and setters
    public Address(String street, String city) {
        this.street = street;
        this.city = city;
    }

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

public class Person {
    private String name;
    private Address address;

    // Constructor, getters, and setters
    public Person(String name, Address address) {
        this.name = name;
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }
}

Nested Property Access Example:

public class Main {
    public static void main(String[] args) {
        // Create a new Address object
        Address address = new Address("Street 123", "City A");

        // Create a new Person object with the Address object
        Person person = new Person("John", address);

        // Accessing nested properties
        System.out.println("Name: " + person.getName());                // Output: John
        System.out.println("Street: " + person.getAddress().getStreet());  // Output: Street 123
        System.out.println("City: " + person.getAddress().getCity());      // Output: City A
    }
}

ব্যাখ্যা:

  • Person ক্লাসে একটি Address অবজেক্ট রয়েছে।
  • Nested properties অ্যাক্সেস করতে person.getAddress().getStreet() এবং person.getAddress().getCity() ব্যবহার করা হয়েছে।

Indexed Properties (ইন্ডেক্সড প্রপার্টি)

Indexed Properties হল এমন প্রপার্টি যা array বা list টাইপের হতে পারে। এটি getter এবং setter মেথডের মাধ্যমে ইন্ডেক্স ব্যবহার করে অ্যাক্সেস করা যায়।

উদাহরণ: Indexed Property Access

public class Team {
    private String[] members;

    // Constructor, getter, and setter
    public Team() {
        members = new String[5];  // Assume the team can have 5 members
    }

    public String getMember(int index) {
        return members[index];
    }

    public void setMember(int index, String name) {
        members[index] = name;
    }
}

Indexed Property Access Example:

public class Main {
    public static void main(String[] args) {
        // Create a new Team object
        Team team = new Team();

        // Set members using indexed setter
        team.setMember(0, "Alice");
        team.setMember(1, "Bob");

        // Get members using indexed getter
        System.out.println("Member 1: " + team.getMember(0));  // Output: Alice
        System.out.println("Member 2: " + team.getMember(1));  // Output: Bob
    }
}

ব্যাখ্যা:

  • Team ক্লাসে একটি String array ব্যবহার করা হয়েছে যা সদস্যদের নাম ধারণ করে।
  • Indexed properties অ্যাক্সেস করতে getMember() এবং setMember() মেথড ব্যবহার করা হয়েছে।

সারাংশ

  • Getter এবং Setter মেথড ব্যবহার করে Java Beans বা সাধারণ Java ক্লাসগুলিতে প্রপার্টি অ্যাক্সেস এবং ম্যানিপুলেশন করা হয়। এটি Encapsulation পদ্ধতির অংশ, যা ডেটা নিরাপত্তা এবং কোড পরিস্কার রাখে।
  • Nested Properties অন্য একটি Bean এর মধ্যে প্রপার্টি অ্যাক্সেস করতে সাহায্য করে, যা Java Beans এ সাধারিত।
  • Indexed Properties array বা list ধরনের প্রপার্টি অ্যাক্সেস করার জন্য ব্যবহৃত হয়, যেখানে প্রপার্টির মান ইন্ডেক্সের মাধ্যমে অ্যাক্সেস করা যায়।
Content added || updated By

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 ব্যবহার করা হলে, তবে কোডের পারফরম্যান্স কিছুটা কমে যেতে পারে, তাই প্রয়োজনের ভিত্তিতে এর ব্যবহার সীমিত রাখাটা ভালো।

Content added || updated By
Promotion

Are you sure to start over?

Loading...