Interfaces এর Methods এবং Fields Access করা

Interfaces এবং Superclasses Access - জাভা রিফ্লেক্ট প্যাকেজ (Java.reflect Package) - Java Technologies

319

Interfaces জাভার একটি মৌলিক অংশ, যা একটি কনট্রাক্ট বা চুক্তি হিসেবে কাজ করে। সাধারণত, একটি interface ক্লাসের মতই থাকে, তবে এটি method signatures নির্ধারণ করে এবং সাধারণত এর মধ্যে কোনও বাস্তবায়ন (implementation) থাকে না। জাভাতে, আপনি reflection ব্যবহার করে interface এর methods এবং fields অ্যাক্সেস করতে পারেন।

Reflection এর মাধ্যমে Interface এর Methods এবং Fields Access করা

রিফ্লেকশন ব্যবহার করে আপনি একটি interface এর methods এবং fields এক্সপ্লোর এবং অ্যাক্সেস করতে পারেন। এটি সাধারণত Class, Method, এবং Field ক্লাসের মেথড ব্যবহার করে করা হয়।

Interface এর Methods এবং Fields Access করার পদক্ষেপ:

  1. Interface এর Class অবজেক্ট পাবেন:
    • প্রথমে, আপনি Class অবজেক্ট ব্যবহার করে ইন্টারফেসের methods এবং fields পেতে পারেন।
  2. Methods Access করা:
    • Class.getDeclaredMethods() অথবা Class.getMethods() ব্যবহার করে আপনি ইন্টারফেসের methods অ্যাক্সেস করতে পারেন।
  3. Fields Access করা:
    • Class.getDeclaredFields() অথবা Class.getFields() ব্যবহার করে আপনি ইন্টারফেসের fields অ্যাক্সেস করতে পারেন।

উদাহরণ:

ধরা যাক, আমাদের একটি Animal ইন্টারফেস আছে এবং তার একটি কনক্রিট ক্লাস Dog রয়েছে।

1. Interface এবং Concrete Class তৈরি করা:

interface Animal {
    void makeSound(); // Abstract method
    String getName();  // Abstract method
}

class Dog implements Animal {
    private String name;

    public Dog(String name) {
        this.name = name;
    }

    @Override
    public void makeSound() {
        System.out.println("Woof Woof");
    }

    @Override
    public String getName() {
        return this.name;
    }
}

2. Reflection দিয়ে Interface এর Methods এবং Fields Access করা:

import java.lang.reflect.*;

public class ReflectionExample {
    public static void main(String[] args) throws Exception {
        // Dog ক্লাসের রিফ্লেকশন অবজেক্ট পেতে
        Class<?> dogClass = Dog.class;

        // ইন্টারফেস Animal এর methods অ্যাক্সেস করা
        System.out.println("Methods in Animal interface:");
        Method[] methods = dogClass.getInterfaces()[0].getDeclaredMethods();  // প্রথম ইন্টারফেস (Animal)
        
        for (Method method : methods) {
            System.out.println("Method name: " + method.getName());
        }

        // ইন্টারফেসের মধ্যে fields অ্যাক্সেস করা
        System.out.println("\nFields in Dog class:");
        Field[] fields = dogClass.getDeclaredFields();  // Dog ক্লাসের fields
        for (Field field : fields) {
            System.out.println("Field name: " + field.getName());
        }
        
        // Dog ক্লাসের একটি ইনস্ট্যান্স তৈরি
        Dog dog = new Dog("Buddy");
        
        // মেথড ইনভোকেশন
        Method makeSoundMethod = dogClass.getMethod("makeSound");
        makeSoundMethod.invoke(dog);  // Output: Woof Woof
        
        // ফিল্ড ভ্যালু এক্সেস
        Field nameField = dogClass.getDeclaredField("name");
        nameField.setAccessible(true);  // Private field access
        String name = (String) nameField.get(dog);
        System.out.println("Dog's name: " + name);  // Output: Buddy
    }
}

আউটপুট:

Methods in Animal interface:
Method name: makeSound
Method name: getName

Fields in Dog class:
Field name: name
Woof Woof
Dog's name: Buddy

ব্যাখ্যা:

  1. dogClass.getInterfaces()[0].getDeclaredMethods():
    • getInterfaces() মেথডের মাধ্যমে আমরা Dog ক্লাসের যে ইন্টারফেসগুলো ইমপ্লিমেন্ট করা হয়েছে তা পাই। এখানে [0] দ্বারা আমরা প্রথম ইন্টারফেস (যেটি Animal হবে) পেয়ে যাই। তারপর getDeclaredMethods() মেথডের মাধ্যমে ইন্টারফেসের সব মেথড অ্যাক্সেস করি।
  2. dogClass.getDeclaredFields():
    • Dog ক্লাসের ফিল্ডসমূহ অ্যাক্সেস করতে getDeclaredFields() মেথড ব্যবহার করা হয়েছে।
  3. Method Invocation:
    • makeSound মেথডটি রিফ্লেকশন দিয়ে ইনভোকেশন করা হয়েছে এবং এর আউটপুট "Woof Woof" আসবে।
  4. Field Access:
    • name ফিল্ডটি private হওয়া সত্ত্বেও setAccessible(true) ব্যবহার করে এটি অ্যাক্সেস করা হয়েছে এবং এর মান Buddy পাওয়া গেছে।

Reflection এবং Interface: কিছু গুরুত্বপূর্ণ পয়েন্ট:

  1. getInterfaces() মেথড:
    • একটি ক্লাসের সমস্ত ইন্টারফেস অ্যাক্সেস করতে এই মেথডটি ব্যবহার করা হয়। এটি ইন্টারফেসের Class অবজেক্ট অ্যারে রিটার্ন করে।
  2. getDeclaredMethods() vs getMethods():
    • getDeclaredMethods(): ক্লাসের সমস্ত methods (private, protected, public) অ্যাক্সেস করতে ব্যবহার করা হয়।
    • getMethods(): শুধুমাত্র public methods অ্যাক্সেস করতে ব্যবহৃত হয়, যার মধ্যে সুপারক্লাস থেকে পাওয়া public methodsও অন্তর্ভুক্ত থাকে।
  3. setAccessible(true):
    • private, protected অথবা default visibility এর ফিল্ড বা মেথড অ্যাক্সেস করার জন্য setAccessible(true) ব্যবহার করা হয়।
  4. Field.get() এবং Field.set():
    • Field.get() ব্যবহার করে আপনি কোনো অবজেক্টের ফিল্ডের মান পড়তে পারেন এবং Field.set() ব্যবহার করে আপনি ফিল্ডের মান পরিবর্তন করতে পারেন।

রিফ্লেকশন (Reflection) ব্যবহার করে আপনি interfaces এর methods এবং fields অ্যাক্সেস করতে পারেন, যা ডাইনামিক কোডিংয়ের জন্য উপকারী। এটি বিশেষত টুলস, ফ্রেমওয়ার্কস এবং লাইব্রেরি তৈরি করতে সাহায্য করে যেখানে আপনাকে রানটাইমে কোডের বৈশিষ্ট্য পর্যবেক্ষণ এবং পরিবর্তন করতে হয়। তবে, রিফ্লেকশন ব্যবহারের সময় পারফরম্যান্স এবং সিকিউরিটি বিষয়ক ঝুঁকির কথা মনে রাখতে হবে।

Content added By
Promotion

Are you sure to start over?

Loading...