IllegalAccessException এবং NoSuchMethodException এর সমাধান

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

289

জাভাতে Reflection ব্যবহার করার সময় আপনি কখনও কখনও দুটি সাধারণ exception পেতে পারেন:

  1. IllegalAccessException:
    • এই exceptionটি তখন হয় যখন আপনি এমন একটি ফিল্ড বা মেথড অ্যাক্সেস করার চেষ্টা করেন যেটি private বা protected (অথবা অন্য ধরনের অ্যাক্সেস কন্ট্রোল) থাকে এবং আপনি যথাযথ অনুমতি ছাড়া সেই ফিল্ড বা মেথডে অ্যাক্সেস করার চেষ্টা করেন।
  2. NoSuchMethodException:
    • এই exceptionটি তখন হয় যখন আপনি এমন একটি মেথড কল করার চেষ্টা করেন যা ক্লাসে বা ইন্টারফেসে উপস্থিত নেই। এটি সাধারণত তখন ঘটে যখন আপনি ভুল মেথড সিগনেচার (method signature) প্রদান করেন।

সমাধান:

1. IllegalAccessException সমাধান:

  • IllegalAccessException সাধারণত হয় যখন আপনি একটি প্রাইভেট বা প্রোটেক্টেড ফিল্ড বা মেথড অ্যাক্সেস করার চেষ্টা করেন। এর সমাধান হল setAccessible(true) ব্যবহার করা।
  • setAccessible(true) ব্যবহার করার মাধ্যমে আপনি প্রাইভেট বা প্রোটেক্টেড ফিল্ড বা মেথড অ্যাক্সেস করতে পারেন।

উদাহরণ:

import java.lang.reflect.*;

class MyClass {
    private String secret = "This is a secret";

    private void showSecret() {
        System.out.println(secret);
    }
}

public class ReflectionExample {
    public static void main(String[] args) throws Exception {
        MyClass myObject = new MyClass();

        // Reflection মাধ্যমে 'secret' ফিল্ডে অ্যাক্সেস
        Field field = myObject.getClass().getDeclaredField("secret");
        field.setAccessible(true); // Private ফিল্ড অ্যাক্সেস করার জন্য

        // ফিল্ডের মান পড়া
        String fieldValue = (String) field.get(myObject);
        System.out.println("Field Value: " + fieldValue);  // Output: This is a secret

        // Reflection মাধ্যমে 'showSecret' মেথডে অ্যাক্সেস
        Method method = myObject.getClass().getDeclaredMethod("showSecret");
        method.setAccessible(true); // Private মেথড অ্যাক্সেস করার জন্য

        // মেথড কল করা
        method.invoke(myObject);  // Output: This is a secret
    }
}

এখানে কি হচ্ছে?

  • field.setAccessible(true) ব্যবহার করা হয়েছে যাতে আমরা secret নামক private ফিল্ডে অ্যাক্সেস করতে পারি।
  • method.setAccessible(true) ব্যবহার করা হয়েছে যাতে আমরা showSecret() নামক private মেথড কল করতে পারি।

2. NoSuchMethodException সমাধান:

  • NoSuchMethodException তখন হয় যখন আপনি এমন মেথড অ্যাক্সেস করার চেষ্টা করেন যা কোনো ক্লাসে উপস্থিত নেই।
  • এটি তখন ঘটে যখন আপনি মেথডের সঠিক নাম বা সঠিক প্যারামিটার টাইপ প্রদান করেন না।
  • NoSuchMethodException সমাধান করার জন্য, আপনাকে সঠিক মেথড নাম এবং সঠিক প্যারামিটার টাইপ প্রদান করতে হবে।

উদাহরণ:

class MyClass {
    public void myMethod(String name) {
        System.out.println("Hello, " + name);
    }
}

public class ReflectionExample {
    public static void main(String[] args) throws Exception {
        MyClass myObject = new MyClass();

        // সঠিক প্যারামিটার টাইপ সহ মেথড পেতে
        Method method = myObject.getClass().getMethod("myMethod", String.class);

        // মেথড ইনভোকেশন
        method.invoke(myObject, "John");  // Output: Hello, John
    }
}

এখানে কি হচ্ছে?

  • getMethod("myMethod", String.class) সঠিক মেথড নাম এবং প্যারামিটার টাইপ প্রদান করা হয়েছে, তাই NoSuchMethodException ঘটবে না।

সাধারণ সমাধান পয়েন্ট:

  1. setAccessible(true):
    • যখন আপনি প্রাইভেট, প্রোটেক্টেড বা ডিফল্ট ফিল্ড বা মেথড অ্যাক্সেস করতে চান, তখন setAccessible(true) ব্যবহার করুন। এটি রিফ্লেকশন দ্বারা তাদের অ্যাক্সেসের অনুমতি দেয়।
  2. getDeclaredMethod() vs getMethod():
    • getDeclaredMethod(): এটি কোনো ক্লাসে থাকা প্রাইভেট, প্রোটেক্টেড, পাবলিক সমস্ত মেথডের রেফারেন্স প্রদান করে।
    • getMethod(): এটি শুধুমাত্র পাবলিক মেথডগুলি অ্যাক্সেস করে (সুপারক্লাসের পাবলিক মেথডও অন্তর্ভুক্ত হবে)।
  3. প্যারামিটার টাইপের সঠিক ব্যবহার:
    • NoSuchMethodException এড়ানোর জন্য, মেথডের সঠিক নাম এবং প্যারামিটার টাইপ ব্যবহার করতে হবে। আপনি Class.getMethod(String name, Class<?>... parameterTypes) ব্যবহার করে মেথডের সঠিক সিগনেচার প্রদান করুন।
  • IllegalAccessException এবং NoSuchMethodException দুটি সাধারণ সমস্যা যেগুলি রিফ্লেকশন ব্যবহারের সময় হতে পারে। সঠিকভাবে setAccessible(true) ব্যবহার করে আপনি private ফিল্ড এবং মেথড অ্যাক্সেস করতে পারেন এবং সঠিক মেথড নাম এবং প্যারামিটার টাইপ ব্যবহার করে আপনি NoSuchMethodException সমাধান করতে পারেন। এই দুটি exception এর সমাধান জানলে রিফ্লেকশন দিয়ে কাজ করা অনেক সহজ এবং নিরাপদ হয়ে ওঠে।
Content added By
Promotion

Are you sure to start over?

Loading...