জাভা রিফ্লেকশন (Reflection) একটি শক্তিশালী ফিচার যা আপনাকে ক্লাস, মেথড, ফিল্ড, এবং ইন্টারফেস সম্পর্কে রানটাইমে তথ্য অর্জন করতে দেয়। ইন্টারফেস হলো একটি abstract type যা একাধিক ক্লাসের জন্য কমন অপারেশন নির্ধারণ করে, কিন্তু কোনো কার্যকর বাস্তবায়ন দেয় না। রিফ্লেকশন ব্যবহার করে আপনি একটি ক্লাসের ইন্টারফেস বা ক্লাসের সাথে যুক্ত ইন্টারফেসগুলি রানটাইমে অ্যাক্সেস এবং প্রসেস করতে পারেন।
কিভাবে Reflection দিয়ে একটি Class এর Interface Access করা হয়?
রিফ্লেকশন ব্যবহার করে একটি ক্লাসের ইন্টারফেস অ্যাক্সেস করতে হলে আপনাকে getInterfaces() মেথড ব্যবহার করতে হবে। এই মেথডটি আপনাকে একটি অ্যারে প্রদান করে যেটি সেই ক্লাসের ইন্টারফেসগুলো ধারণ করে।
উদাহরণ:
ধরা যাক, আমাদের একটি Car ক্লাস রয়েছে, যা Vehicle এবং Automobile নামের দুটি ইন্টারফেস বাস্তবায়ন করেছে। আমরা রিফ্লেকশন ব্যবহার করে এই ক্লাসের ইন্টারফেসগুলো অ্যাক্সেস করব।
import java.lang.reflect.*;
interface Vehicle {
void start();
void stop();
}
interface Automobile {
void drive();
}
class Car implements Vehicle, Automobile {
@Override
public void start() {
System.out.println("Car started.");
}
@Override
public void stop() {
System.out.println("Car stopped.");
}
@Override
public void drive() {
System.out.println("Car is driving.");
}
}
public class ReflectionExample {
public static void main(String[] args) {
try {
// Car ক্লাসের রিফ্লেকশন অবজেক্ট পেতে
Class<?> clazz = Car.class;
// getInterfaces() মেথড ব্যবহার করে ক্লাসের ইন্টারফেসগুলি অ্যাক্সেস করা
Class<?>[] interfaces = clazz.getInterfaces();
// সমস্ত ইন্টারফেস প্রিন্ট করা
System.out.println("Interfaces implemented by " + clazz.getName() + ":");
for (Class<?> iface : interfaces) {
System.out.println(iface.getName());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
আউটপুট:
Interfaces implemented by Car:
Vehicle
Automobile
কোড ব্যাখ্যা:
VehicleএবংAutomobileইন্টারফেস:Vehicleইন্টারফেসে দুটি মেথড (start()এবংstop()) রয়েছে।Automobileইন্টারফেসে একটি মেথড (drive()) রয়েছে।
Carক্লাস:Carক্লাসটিVehicleএবংAutomobileদুটি ইন্টারফেসের বাস্তবায়ন প্রদান করেছে।- ক্লাসটি
start(),stop(), এবংdrive()মেথডগুলির বাস্তবায়ন করেছে।
getInterfaces()মেথড:clazz.getInterfaces()মেথডটিCarক্লাসের সাথে যুক্ত সমস্ত ইন্টারফেসের তালিকা প্রদান করে। এই মেথডটি একটিClass<?>[]অ্যারে রিটার্ন করে, যাতে ওই ক্লাসের সকল ইন্টারফেস থাকে।
- রিফ্লেকশন ব্যবহার:
- রিফ্লেকশন ব্যবহার করে আমরা
Car.class.getInterfaces()মেথডটি কল করেছি এবং এর মাধ্যমেCarক্লাসের ইন্টারফেসগুলোর নাম প্রিন্ট করেছি।
- রিফ্লেকশন ব্যবহার করে আমরা
getInterfaces() এবং getSuperclass() এর মধ্যে পার্থক্য:
getInterfaces(): এটি একটি ক্লাস বা ইন্টারফেসের সমস্ত ইন্টারফেস অ্যাক্সেস করতে ব্যবহৃত হয়। এটি শুধুমাত্র সেই ইন্টারফেসগুলো রিটার্ন করে যা ক্লাসের সাথে যুক্ত।getSuperclass(): এটি একটি ক্লাসের সুপারক্লাস (বেস ক্লাস) রিটার্ন করে। সুপারক্লাসের ইন্টারফেস অ্যাক্সেস করতে আপনাকেgetInterfaces()ব্যবহার করতে হবে।
মাল্টিপল ইন্টারফেস এক্সটেনশন:
- একাধিক ইন্টারফেস বাস্তবায়নকারী ক্লাসের জন্য, আপনি
getInterfaces()ব্যবহার করে সমস্ত ইন্টারফেস একসাথে অ্যাক্সেস করতে পারেন, যেমনটি উপরের উদাহরণেCarক্লাসের জন্য দেখানো হয়েছে।
isInterface() মেথডের ব্যবহার:
রিফ্লেকশন ব্যবহার করে আপনি একটি নির্দিষ্ট Class অবজেক্টের মাধ্যমে এটি যাচাই করতে পারেন যে এটি একটি ইন্টারফেস কিনা। এর জন্য isInterface() মেথডটি ব্যবহার করা হয়।
public class InterfaceCheckExample {
public static void main(String[] args) {
try {
// Car ক্লাসের রিফ্লেকশন অবজেক্ট পেতে
Class<?> clazz = Car.class;
// getInterfaces() মেথড ব্যবহার করে ক্লাসের ইন্টারফেসগুলির অ্যারে পেতে
Class<?>[] interfaces = clazz.getInterfaces();
// প্রতিটি ইন্টারফেস পরীক্ষা করা
for (Class<?> iface : interfaces) {
if (iface.isInterface()) {
System.out.println(iface.getName() + " is an interface.");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
আউটপুট:
Vehicle is an interface.
Automobile is an interface.
getInterfaces()মেথডের মাধ্যমে আপনি একটি ক্লাসের সমস্ত ইন্টারফেস অ্যাক্সেস করতে পারেন।- রিফ্লেকশন ব্যবহার করে আপনি রানটাইমে একটি ক্লাসের সাথে যুক্ত সমস্ত ইন্টারফেস সম্পর্কে জানতে পারেন এবং এই ইন্টারফেসগুলির উপর কাজ করতে পারেন।
- আপনি
isInterface()মেথড ব্যবহার করে যাচাই করতে পারেন যে একটি নির্দিষ্টClassএকটি ইন্টারফেস কিনা।
Read more