java.lang.reflect প্যাকেজের মাধ্যমে আপনি annotations এর তথ্যও রানটাইমে (runtime) অ্যাক্সেস করতে পারেন। Annotations হল Java এর একটি শক্তিশালী বৈশিষ্ট্য যা ক্লাস, মেথড, ফিল্ড ইত্যাদির মেটাডেটা ধারণ করে। রিফ্লেকশন ব্যবহার করে, আপনি রানটাইমে annotations এর মান এবং তাদের ব্যবহারকারী ক্লাস, মেথড বা ফিল্ডগুলির সাথে সম্পর্কিত তথ্য জানতে পারেন।
Annotations কী?
- Annotations হল মেটাডেটা যা কোডের ওপর তথ্য সরবরাহ করে, কিন্তু এগুলো কোডের কার্যকারিতার উপর সরাসরি প্রভাব ফেলে না। আপনি annotations কে ব্যবহার করে বিভিন্ন অতিরিক্ত তথ্য প্রদান করতে পারেন যা বিশেষ ধরনের প্রক্রিয়া বা কার্যক্রম সম্পাদন করতে সাহায্য করে, যেমন JUnit টেস্ট, Dependency Injection, ORM Frameworks ইত্যাদি।
Reflection দিয়ে Annotations Access করা:
Java Reflection API-তে getAnnotations() বা getDeclaredAnnotations() মেথড ব্যবহার করে আপনি একটি ক্লাস, মেথড বা ফিল্ডের annotations অ্যাক্সেস করতে পারেন। এর মাধ্যমে আপনি কোনও মেথডের, ক্লাসের বা ফিল্ডের ওপর প্রয়োগকৃত annotations পরীক্ষা করতে পারেন এবং এর মানও পেতে পারেন।
Annotations Access করার জন্য Steps:
- Class বা Method বা Field এর ওপর প্রয়োগকৃত annotations পেতে
getAnnotations()বাgetDeclaredAnnotations()ব্যবহার করতে হয়। - প্রতিটি annotation এক্সট্র্যাক্ট (extract) করা হয় এবং
annotationType()বাtoString()এর মাধ্যমে এর তথ্য পাওয়া যায়।
ধরা যাক, আমাদের একটি annotation রয়েছে:
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME) // Annotation শুধুমাত্র Runtime এ থাকবে
@Target(ElementType.METHOD) // এটি শুধুমাত্র মেথডে ব্যবহার করা যাবে
@interface MyAnnotation {
String description() default "No Description"; // একটি parameter দেয়া হয়েছে
}
এটি একটি কাস্টম annotation যা একটি মেথডের ওপর প্রয়োগ করা হবে। এখন, Reflection ব্যবহার করে এই annotation অ্যাক্সেস করা হবে।
Annotation ব্যবহার করা:
public class AnnotationExample {
@MyAnnotation(description = "This is a sample method")
public void myMethod() {
System.out.println("Inside myMethod!");
}
public static void main(String[] args) throws Exception {
// Annotation অ্যাক্সেস করতে ক্লাসের অবজেক্ট তৈরি করা
Class<?> cls = AnnotationExample.class;
// মেথডের উপর প্রয়োগকৃত annotation পেতে
Method method = cls.getMethod("myMethod");
// Annotation পাওয়া যাবে কি না তা চেক করা
if (method.isAnnotationPresent(MyAnnotation.class)) {
// Annotation এক্সট্র্যাক্ট করা
MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
// Annotation এর তথ্য পাওয়া
System.out.println("Annotation description: " + annotation.description());
}
}
}
ব্যাখ্যা:
- Annotation Declaration:
@Retention(RetentionPolicy.RUNTIME)এভাবে আন্ডারলাইন করা হয়েছে যাতে এটি রানটাইমে অ্যাক্সেসযোগ্য থাকে।@Target(ElementType.METHOD)দ্বারা এটি কেবলমাত্র মেথডে ব্যবহারযোগ্য।
- Method Annotation:
@MyAnnotation(description = "This is a sample method")এই annotationmyMethod()এর ওপর প্রয়োগ করা হয়েছে। এখানে একটি ডিফল্ট মান সহ parameterdescriptionদেওয়া হয়েছে।
- Reflection দিয়ে Annotation Access:
method.isAnnotationPresent(MyAnnotation.class)দিয়ে প্রথমে চেক করা হয় যে মেথডটির ওপরMyAnnotationannotation আছে কি না।- এরপর,
method.getAnnotation(MyAnnotation.class)এর মাধ্যমে annotation এক্সট্র্যাক্ট (extract) করা হয় এবং তার পরannotation.description()মেথড ব্যবহার করে এরdescriptionমানটি অ্যাক্সেস করা হয়।
getAnnotations() এবং getDeclaredAnnotations():
getAnnotations(): এটি শুধুমাত্র পাবলিক মেথড/ফিল্ডের জন্য annotations দেয়।getDeclaredAnnotations(): এটি ক্লাসের সমস্ত (পাবলিক, প্রাইভেট, প্রোটেক্টেড) মেথড/ফিল্ডের জন্য annotations দেয়।
আরেকটি উদাহরণ: Annotations Access on Class Level
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE) // কেবল ক্লাসে প্রয়োগ হবে
@interface ClassInfo {
String author() default "Unknown";
String date();
}
@ClassInfo(author = "John Doe", date = "12/12/2024")
public class AnnotatedClass {
public void display() {
System.out.println("Class with annotation!");
}
public static void main(String[] args) throws Exception {
Class<?> cls = AnnotatedClass.class;
// ক্লাসের উপর প্রয়োগকৃত annotation চেক করা
if (cls.isAnnotationPresent(ClassInfo.class)) {
ClassInfo classInfo = cls.getAnnotation(ClassInfo.class);
System.out.println("Author: " + classInfo.author());
System.out.println("Date: " + classInfo.date());
}
}
}
ব্যাখ্যা:
ClassInfoAnnotation:- এখানে
ClassInfoনামক annotation তৈরি করা হয়েছে যাauthorএবংdateনামক দুটি parameter রাখে।authorএর ডিফল্ট মান দেওয়া হয়েছে, কিন্তুdatemandatory (আবশ্যক)।
- এখানে
- Class Level Annotation:
@ClassInfo(author = "John Doe", date = "12/12/2024")এই annotationAnnotatedClassক্লাসের ওপর প্রয়োগ করা হয়েছে।
- Reflection দিয়ে Class Annotation Access:
cls.isAnnotationPresent(ClassInfo.class)দিয়ে চেক করা হয়েছে যেAnnotatedClassক্লাসের ওপরClassInfoannotation প্রয়োগ করা হয়েছে কিনা।- এরপর,
cls.getAnnotation(ClassInfo.class)এর মাধ্যমে annotation এক্সট্র্যাক্ট (extract) করে এর parameter গুলি (যেমনauthorএবংdate) access করা হয়েছে।
Reflection এর মাধ্যমে Annotation Access-এর সুবিধা:
- ডাইনামিক ডেটা: Reflection দিয়ে আপনি কোডের runtime মেটাডেটা, যেমন annotation values এক্সট্র্যাক্ট করতে পারেন।
- মেটাডেটা বিশ্লেষণ: কোডের run-time মেটাডেটা বিশ্লেষণ করে আরও ফ্লেক্সিবল এবং ডাইনামিক অ্যাপ্লিকেশন তৈরি করা সম্ভব।
- অনেক Frameworks এ ব্যবহৃত: Spring, Hibernate, JUnit ইত্যাদি ফ্রেমওয়ার্কগুলিতে অ্যানোটেশন এবং রিফ্লেকশন ব্যাপকভাবে ব্যবহৃত হয়।
Reflection এর মাধ্যমে Annotation Access-এর অসুবিধা:
- পারফরম্যান্স হিট: Reflection অপারেশনগুলি সাধারণত ধীর গতির হয়ে থাকে, বিশেষত যখন রানটাইমে বড় পরিমাণ ডেটা বা মেটাডেটা এক্সট্র্যাক্ট করতে হয়।
- সিকিউরিটি ঝুঁকি: Reflection এর মাধ্যমে প্রাইভেট বা সুরক্ষিত তথ্য অ্যাক্সেস করা সম্ভব, যা নিরাপত্তার জন্য ঝুঁকিপূর্ণ হতে পারে।
- কোডের জটিলতা: Reflection ব্যবহৃত কোডগুলো সাধারণত জটিল হয় এবং এটি মেইনটেইন করতে কিছুটা কঠিন হয়ে পড়ে।
Java Reflection API দিয়ে annotations এর অ্যাক্সেস একটি শক্তিশালী বৈশিষ্ট্য, যা আপনাকে রানটাইমে মেটাডেটা পরিচালনা এবং পরীক্ষা করতে সাহায্য করে। আপনি Reflection এর মাধ্যমে ক্লাস, মেথড বা ফিল্ডে প্রয়োগ করা annotations এবং তাদের ভ্যালুতে অ্যাক্সেস পেতে পারেন, যা অনেক ধরনের ডাইনামিক কার্যকরী কোড তৈরিতে সহায়ক হতে পারে।
Read more