Generic Class এবং Methods Access করা

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

370

Java রিফ্লেকশন প্যাকেজ (java.lang.reflect) ব্যবহার করে Generic Class এবং Generic Methods অ্যাক্সেস করা সম্ভব। তবে, রিফ্লেকশন দিয়ে জেনেরিক টাইপস (generic types) অ্যাক্সেস করার ক্ষেত্রে কিছু সীমাবদ্ধতা রয়েছে, কারণ জেনেরিক টাইপস রানটাইমে type erasure (টাইপ মুছে ফেলা) পদ্ধতির মাধ্যমে বাদ দেওয়া হয়। এর মানে হলো, আপনি যখন জেনেরিক ক্লাস বা মেথড ব্যবহার করেন, তখন জেনেরিক টাইপ রানটাইমে আর উপলব্ধ থাকে না।

1. Generic Class Access

জেনেরিক ক্লাস হলো এমন একটি ক্লাস যা টাইপ প্যারামিটার নিয়ে কাজ করে, যা কোডকে আরও ফ্লেক্সিবল এবং পুনরায় ব্যবহারযোগ্য করে তোলে। রানটাইমে আমরা সাধারণত জেনেরিক ক্লাসের টাইপ প্যারামিটার অ্যাক্সেস করতে পারি না, তবে Reflection এর মাধ্যমে আমরা raw type বা non-generic type অ্যাক্সেস করতে পারি।

উদাহরণ:

import java.lang.reflect.*;

class MyGenericClass<T> {
    private T value;

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

    public void printValue() {
        System.out.println("Value: " + value);
    }
}

public class ReflectionExample {
    public static void main(String[] args) {
        try {
            // MyGenericClass<T> এর raw type অ্যাক্সেস করা
            Class<?> cls = MyGenericClass.class;

            // কনস্ট্রাক্টর খুঁজে বের করা
            Constructor<?> constructor = cls.getConstructor(Object.class);

            // কনস্ট্রাক্টর ব্যবহার করে অবজেক্ট তৈরি করা
            Object obj = constructor.newInstance("Hello, Generics!");

            // মেথড অ্যাক্সেস করা
            Method method = cls.getMethod("printValue");

            // মেথড ইনভোক করা
            method.invoke(obj);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ব্যাখ্যা:

  1. MyGenericClass একটি জেনেরিক ক্লাস যা T টাইপ প্যারামিটার নেয়।
  2. রানটাইমে raw type (অর্থাৎ MyGenericClass ক্লাস) অ্যাক্সেস করা হয়েছে এবং Object টাইপ প্যারামিটার দিয়ে কনস্ট্রাক্টর ইনস্ট্যান্সিয়েট করা হয়েছে।
  3. Reflection এর মাধ্যমে printValue() মেথড ইনভোক করা হয়েছে।

2. Generic Method Access

একইভাবে, আপনি জেনেরিক মেথডগুলোর রিফ্লেকশন ব্যবহার করে অ্যাক্সেস করতে পারেন, তবে জেনেরিক টাইপ্সের type erasure এর কারণে আপনি মেথডের জেনেরিক টাইপ জানবেন না। কিন্তু আপনি যদি মেথডের প্যারামিটার টাইপ বা রিটার্ন টাইপ রিফ্লেকশন ব্যবহার করে চেক করতে চান, তবে আপনি সেগুলো অ্যাক্সেস করতে পারবেন।

উদাহরণ:

import java.lang.reflect.*;

class MyGenericClass {
    // জেনেরিক মেথড
    public <T> void printArray(T[] array) {
        for (T element : array) {
            System.out.println(element);
        }
    }
}

public class ReflectionExample {
    public static void main(String[] args) {
        try {
            // MyGenericClass ক্লাসের অবজেক্ট তৈরি করা
            Class<?> cls = MyGenericClass.class;
            MyGenericClass obj = new MyGenericClass();

            // জেনেরিক মেথড "printArray" খুঁজে বের করা
            Method method = cls.getMethod("printArray", Object[].class);

            // মেথড ইনভোক করা
            String[] data = {"Hello", "Reflection", "Generics"};
            method.invoke(obj, (Object) data);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ব্যাখ্যা:

  1. printArray একটি জেনেরিক মেথড যা টাইপ প্যারামিটার T গ্রহণ করে এবং একটি অ্যারে প্রিন্ট করে।
  2. Reflection এর মাধ্যমে getMethod() ব্যবহার করে printArray মেথডটি খুঁজে বের করা হয়েছে, যেখানে প্যারামিটার হিসেবে Object[].class পাস করা হয়েছে। এর ফলে, মেথডটি যে কোনো টাইপের অ্যারে গ্রহণ করতে পারবে।
  3. মেথডটি ইনভোক করার সময় data অ্যারে প্রদান করা হয়েছে।

3. Generic Class এবং Method-এর প্যারামিটার টাইপ Access করা

Java Reflection API দ্বারা আপনি type parameters বা generic type parameters জানতে পারবেন, তবে, মনে রাখতে হবে যে, টাইপ-ইরেজার (type erasure) এর কারণে রানটাইমে তথ্য হারিয়ে যায়। তবে, আপনি Type ক্লাসের সাহায্যে টাইপ প্যারামিটার অ্যাক্সেস করতে পারেন।

উদাহরণ:

import java.lang.reflect.*;

class MyGenericClass<T> {
    private T value;

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

    public T getValue() {
        return value;
    }
}

public class ReflectionExample {
    public static void main(String[] args) {
        try {
            // MyGenericClass<String> এর ক্লাস অবজেক্ট অ্যাক্সেস করা
            Class<?> cls = MyGenericClass.class;

            // টাইপ প্যারামিটারগুলো চেক করা
            Type genericSuperclass = cls.getGenericSuperclass();
            System.out.println("Generic superclass: " + genericSuperclass);

            // কনস্ট্রাক্টর এবং মেথড খুঁজে বের করা
            Constructor<?> constructor = cls.getConstructor(Object.class);
            Method method = cls.getMethod("getValue");

            // কনস্ট্রাক্টর এবং মেথড ইনভোক করা
            Object obj = constructor.newInstance("Reflection with Generics");
            System.out.println("Value from method: " + method.invoke(obj));

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ব্যাখ্যা:

  1. Generic Class: MyGenericClass<T> তৈরি করা হয়েছে এবং এতে T টাইপ প্যারামিটার রয়েছে।
  2. Reflection দিয়ে getGenericSuperclass() ব্যবহার করে আপনি ক্লাসের জেনেরিক সুপারক্লাস দেখতে পারেন।
  3. getMethod() এবং getConstructor() ব্যবহার করে জেনেরিক মেথড এবং কনস্ট্রাক্টর এক্সেস করা হয়েছে।

4. Generic Class এবং Method Access-এর Limitations

  • Type Erasure: Java জেনেরিক টাইপগুলো রানটাইমে type erasure এর মাধ্যমে মুছে ফেলা হয়। এর মানে হলো, T বা জেনেরিক টাইপ রানটাইমে আর উপলব্ধ থাকে না, তাই আপনি রিফ্লেকশন ব্যবহার করে জেনেরিক টাইপের তথ্য অ্যাক্সেস করতে পারবেন না, শুধুমাত্র raw type বা non-generic type অ্যাক্সেস করতে পারবেন।
  • Generic Methods: জেনেরিক মেথডের প্যারামিটারও type erasure এর কারণে রানটাইমে পুরোপুরি মুছে ফেলা হয়। তবে, আপনি মেথডের parameter types বা return types অ্যাক্সেস করতে পারবেন।

Java Reflection API দিয়ে Generic Class এবং Generic Methods অ্যাক্সেস করার জন্য কিছু সীমাবদ্ধতা রয়েছে, কারণ জেনেরিক টাইপ type erasure এর মাধ্যমে রানটাইমে মুছে ফেলা হয়। তবে, আপনি ক্লাস এবং মেথডের raw types এবং তাদের প্যারামিটার এবং রিটার্ন টাইপ অ্যাক্সেস করতে পারেন। এটি জেনেরিক ক্লাস এবং মেথডের জন্য রানটাইমে ডাইনামিক আচরণ প্রয়োগ করার জন্য কার্যকর।

Content added By
Promotion

Are you sure to start over?

Loading...