Generics কি এবং কিভাবে Reflection এর মাধ্যমে Access করা যায়?

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

330

Generics হল একটি শক্তিশালী বৈশিষ্ট্য যা জাভায় টাইপ সেফটি বজায় রেখে কোলেকশন এবং অন্যান্য ডেটা স্ট্রাকচারগুলি আরও সাধারণ এবং পুনঃব্যবহারযোগ্য করে তোলে। জাভায় Generics ব্যবহার করে আপনি টাইপের নির্দিষ্টতা (type safety) বজায় রেখে কোড লেখার সুবিধা পান, যেমন List<String> বা Map<Integer, String> টাইপগুলি।

Generics কি?

Generics জাভায় একটি কনসেপ্ট যা আপনাকে টাইপ প্যারামিটার হিসেবে ব্যবহার করতে দেয়। এর মাধ্যমে আপনি ক্লাস, ইন্টারফেস, বা মেথডের মধ্যে টাইপের সাধারণতা বজায় রাখতে পারেন। এতে কোডের পুনঃব্যবহারযোগ্যতা এবং টাইপ সেফটি উন্নত হয়।

উদাহরণ:

// Generics ব্যবহার করে List তৈরি
List<String> list = new ArrayList<>();
list.add("Hello");
list.add("World");

// List এর উপাদানগুলি টাইপ সেফ
String element = list.get(0);  // টাইপ সেফটি বজায় থাকে

Generics এর সাথে Reflection:

রিফ্লেকশন ব্যবহার করে আপনি জাভার টাইপ প্যারামিটার (Generic Type) গুলি রানটাইমে অ্যাক্সেস করতে পারেন, যদিও Generics সাধারণত রানটাইমে মুছে যায় (type erasure) এবং রানটাইমে তাদের প্রকৃত টাইপের তথ্য সরাসরি অ্যাক্সেস করা সম্ভব নয়।

তবে, রিফ্লেকশন দিয়ে আপনি Generic Type সম্পর্কে কিছু তথ্য পেতে পারেন। উদাহরণস্বরূপ, আপনি কোন List<T> অথবা Map<K, V> এ কোন টাইপ ব্যবহার করা হচ্ছে তা রিফ্লেকশন ব্যবহার করে জানার চেষ্টা করতে পারেন।

Generics এর সাথে Reflection এর ব্যবহার:

1. Generic Type এর তথ্য সংগ্রহ করা:

রিফ্লেকশন ব্যবহার করে আপনি টাইপ প্যারামিটারগুলো এক্সট্র্যাক্ট করতে পারেন, যদিও Generics টাইপ ইরেজ (type erasure) দ্বারা রানটাইমে মুছে যায়।

এটি করতে হলে আপনি ParameterizedType ইন্টারফেস ব্যবহার করতে হবে, যা আপনাকে টাইপ প্যারামিটার সম্পর্কিত তথ্য প্রদান করে।

উদাহরণ: Generic Type এর তথ্য রিফ্লেকশন দিয়ে অ্যাক্সেস করা

import java.lang.reflect.*;

class MyClass<T> {
    private T value;

    public MyClass(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }
}

public class GenericReflectionExample {
    public static void main(String[] args) throws Exception {
        // MyClass এর একটি ইনস্ট্যান্স তৈরি করি যেখানে T = String
        MyClass<String> myObject = new MyClass<>("Hello, Generics!");

        // Class অবজেক্টের মাধ্যমে রিফ্লেকশন ব্যবহার
        Class<?> clazz = myObject.getClass();

        // ফিল্ডের তথ্য পেতে
        Field field = clazz.getDeclaredField("value");
        
        // ParameterizedType ব্যবহার করে Generic Type এর তথ্য পেতে
        Type fieldType = field.getGenericType();

        // ফিল্ডের টাইপ বের করা
        if (fieldType instanceof ParameterizedType) {
            ParameterizedType parameterizedType = (ParameterizedType) fieldType;
            Type[] typeArgs = parameterizedType.getActualTypeArguments();

            // Generic Type এর তথ্য বের করা
            for (Type typeArg : typeArgs) {
                System.out.println("Generic Type: " + typeArg.getTypeName());
            }
        }

        // ফিল্ডের মান প্রিন্ট করা
        System.out.println("Field Value: " + field.get(myObject));
    }
}

আউটপুট:

Generic Type: java.lang.String
Field Value: Hello, Generics!

ব্যাখ্যা:

  1. MyClass<T>: এখানে T হলো Generic টাইপ। MyClass<String> ব্যবহার করলে T টাইপ হবে String
  2. getDeclaredField("value"): এই মেথডটি ক্লাসের একটি ফিল্ডের রিফ্লেকশন অবজেক্ট পায়, যেটি value ফিল্ড।
  3. getGenericType(): value ফিল্ডের টাইপকে Type রিটার্ন করে, এবং এটি যদি ParameterizedType হয়, তাহলে getActualTypeArguments() মেথডের মাধ্যমে টাইপ প্যারামিটার অ্যাক্সেস করা যায়।
  4. ParameterizedType: এটি টাইপ প্যারামিটারগুলোর বিশদ তথ্য প্রদান করে, যেমন ফিল্ড বা মেথডে ব্যবহৃত টাইপ প্যারামিটার।

Generics এবং Reflection: কিছু গুরুত্বপূর্ণ বিষয়:

  1. টাইপ ইরেজ (Type Erasure):
    • Java Generics এর অন্যতম বৈশিষ্ট্য হলো টাইপ ইরেজ (type erasure)। এর মানে হচ্ছে, কম্পাইল টাইমে নির্ধারিত টাইপ প্যারামিটারগুলো রানটাইমে মুছে যায়, এবং আপনি রানটাইমে ঠিক যে টাইপ প্যারামিটার ব্যবহার করা হয়েছে তা জানতে পারেন না।
  2. ParameterizedType:
    • রিফ্লেকশন ব্যবহার করে আপনি যখন Generic টাইপ অ্যাক্সেস করেন, তখন ParameterizedType ইন্টারফেসের মাধ্যমে টাইপ প্যারামিটার পাওয়া যায়।
  3. Generic Type Access:
    • ক্লাসের টাইপ: getGenericSuperclass() এবং getGenericInterfaces() মেথড ব্যবহার করে ক্লাসের সুপারক্লাস বা ইন্টারফেসের জেনেরিক টাইপও রিফ্লেকশন দিয়ে অ্যাক্সেস করা সম্ভব।

Generics এবং Reflection একসাথে ব্যবহারের মাধ্যমে আপনি টাইপ প্যারামিটার এবং টাইপ সম্পর্কিত তথ্য রানটাইমে অ্যাক্সেস করতে পারেন। তবে, টাইপ ইরেজ কারণে রানটাইমে জেনেরিক টাইপের মূল তথ্য পাওয়া সম্ভব না হলেও, ParameterizedType এর মাধ্যমে কিছু তথ্য উদ্ধার করা সম্ভব। এই বৈশিষ্ট্যটি জাভাতে আরও ডাইনামিক এবং শক্তিশালী কাস্টম লজিক তৈরি করতে সাহায্য করে, বিশেষ করে ফ্রেমওয়ার্ক বা লাইব্রেরি তৈরির ক্ষেত্রে।

Content added By
Promotion

Are you sure to start over?

Loading...