Interfaces জাভার একটি মৌলিক অংশ, যা একটি কনট্রাক্ট বা চুক্তি হিসেবে কাজ করে। সাধারণত, একটি interface ক্লাসের মতই থাকে, তবে এটি method signatures নির্ধারণ করে এবং সাধারণত এর মধ্যে কোনও বাস্তবায়ন (implementation) থাকে না। জাভাতে, আপনি reflection ব্যবহার করে interface এর methods এবং fields অ্যাক্সেস করতে পারেন।
Reflection এর মাধ্যমে Interface এর Methods এবং Fields Access করা
রিফ্লেকশন ব্যবহার করে আপনি একটি interface এর methods এবং fields এক্সপ্লোর এবং অ্যাক্সেস করতে পারেন। এটি সাধারণত Class, Method, এবং Field ক্লাসের মেথড ব্যবহার করে করা হয়।
Interface এর Methods এবং Fields Access করার পদক্ষেপ:
- Interface এর Class অবজেক্ট পাবেন:
- প্রথমে, আপনি
Classঅবজেক্ট ব্যবহার করে ইন্টারফেসের methods এবং fields পেতে পারেন।
- প্রথমে, আপনি
- Methods Access করা:
Class.getDeclaredMethods()অথবাClass.getMethods()ব্যবহার করে আপনি ইন্টারফেসের methods অ্যাক্সেস করতে পারেন।
- 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
ব্যাখ্যা:
dogClass.getInterfaces()[0].getDeclaredMethods():getInterfaces()মেথডের মাধ্যমে আমরাDogক্লাসের যে ইন্টারফেসগুলো ইমপ্লিমেন্ট করা হয়েছে তা পাই। এখানে[0]দ্বারা আমরা প্রথম ইন্টারফেস (যেটিAnimalহবে) পেয়ে যাই। তারপরgetDeclaredMethods()মেথডের মাধ্যমে ইন্টারফেসের সব মেথড অ্যাক্সেস করি।
dogClass.getDeclaredFields():Dogক্লাসের ফিল্ডসমূহ অ্যাক্সেস করতেgetDeclaredFields()মেথড ব্যবহার করা হয়েছে।
- Method Invocation:
makeSoundমেথডটি রিফ্লেকশন দিয়ে ইনভোকেশন করা হয়েছে এবং এর আউটপুট "Woof Woof" আসবে।
- Field Access:
nameফিল্ডটিprivateহওয়া সত্ত্বেওsetAccessible(true)ব্যবহার করে এটি অ্যাক্সেস করা হয়েছে এবং এর মানBuddyপাওয়া গেছে।
Reflection এবং Interface: কিছু গুরুত্বপূর্ণ পয়েন্ট:
getInterfaces()মেথড:- একটি ক্লাসের সমস্ত ইন্টারফেস অ্যাক্সেস করতে এই মেথডটি ব্যবহার করা হয়। এটি ইন্টারফেসের
Classঅবজেক্ট অ্যারে রিটার্ন করে।
- একটি ক্লাসের সমস্ত ইন্টারফেস অ্যাক্সেস করতে এই মেথডটি ব্যবহার করা হয়। এটি ইন্টারফেসের
getDeclaredMethods()vsgetMethods():getDeclaredMethods(): ক্লাসের সমস্ত methods (private, protected, public) অ্যাক্সেস করতে ব্যবহার করা হয়।getMethods(): শুধুমাত্র public methods অ্যাক্সেস করতে ব্যবহৃত হয়, যার মধ্যে সুপারক্লাস থেকে পাওয়া public methodsও অন্তর্ভুক্ত থাকে।
setAccessible(true):- private, protected অথবা default visibility এর ফিল্ড বা মেথড অ্যাক্সেস করার জন্য
setAccessible(true)ব্যবহার করা হয়।
- private, protected অথবা default visibility এর ফিল্ড বা মেথড অ্যাক্সেস করার জন্য
Field.get()এবংField.set():Field.get()ব্যবহার করে আপনি কোনো অবজেক্টের ফিল্ডের মান পড়তে পারেন এবংField.set()ব্যবহার করে আপনি ফিল্ডের মান পরিবর্তন করতে পারেন।
রিফ্লেকশন (Reflection) ব্যবহার করে আপনি interfaces এর methods এবং fields অ্যাক্সেস করতে পারেন, যা ডাইনামিক কোডিংয়ের জন্য উপকারী। এটি বিশেষত টুলস, ফ্রেমওয়ার্কস এবং লাইব্রেরি তৈরি করতে সাহায্য করে যেখানে আপনাকে রানটাইমে কোডের বৈশিষ্ট্য পর্যবেক্ষণ এবং পরিবর্তন করতে হয়। তবে, রিফ্লেকশন ব্যবহারের সময় পারফরম্যান্স এবং সিকিউরিটি বিষয়ক ঝুঁকির কথা মনে রাখতে হবে।
Read more