জাভাতে Reflection ব্যবহার করার সময় আপনি কখনও কখনও দুটি সাধারণ exception পেতে পারেন:
IllegalAccessException:- এই exceptionটি তখন হয় যখন আপনি এমন একটি ফিল্ড বা মেথড অ্যাক্সেস করার চেষ্টা করেন যেটি private বা protected (অথবা অন্য ধরনের অ্যাক্সেস কন্ট্রোল) থাকে এবং আপনি যথাযথ অনুমতি ছাড়া সেই ফিল্ড বা মেথডে অ্যাক্সেস করার চেষ্টা করেন।
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ঘটবে না।
সাধারণ সমাধান পয়েন্ট:
setAccessible(true):- যখন আপনি প্রাইভেট, প্রোটেক্টেড বা ডিফল্ট ফিল্ড বা মেথড অ্যাক্সেস করতে চান, তখন
setAccessible(true)ব্যবহার করুন। এটি রিফ্লেকশন দ্বারা তাদের অ্যাক্সেসের অনুমতি দেয়।
- যখন আপনি প্রাইভেট, প্রোটেক্টেড বা ডিফল্ট ফিল্ড বা মেথড অ্যাক্সেস করতে চান, তখন
getDeclaredMethod()vsgetMethod():getDeclaredMethod(): এটি কোনো ক্লাসে থাকা প্রাইভেট, প্রোটেক্টেড, পাবলিক সমস্ত মেথডের রেফারেন্স প্রদান করে।getMethod(): এটি শুধুমাত্র পাবলিক মেথডগুলি অ্যাক্সেস করে (সুপারক্লাসের পাবলিক মেথডও অন্তর্ভুক্ত হবে)।
- প্যারামিটার টাইপের সঠিক ব্যবহার:
NoSuchMethodExceptionএড়ানোর জন্য, মেথডের সঠিক নাম এবং প্যারামিটার টাইপ ব্যবহার করতে হবে। আপনিClass.getMethod(String name, Class<?>... parameterTypes)ব্যবহার করে মেথডের সঠিক সিগনেচার প্রদান করুন।
IllegalAccessExceptionএবংNoSuchMethodExceptionদুটি সাধারণ সমস্যা যেগুলি রিফ্লেকশন ব্যবহারের সময় হতে পারে। সঠিকভাবেsetAccessible(true)ব্যবহার করে আপনি private ফিল্ড এবং মেথড অ্যাক্সেস করতে পারেন এবং সঠিক মেথড নাম এবং প্যারামিটার টাইপ ব্যবহার করে আপনিNoSuchMethodExceptionসমাধান করতে পারেন। এই দুটি exception এর সমাধান জানলে রিফ্লেকশন দিয়ে কাজ করা অনেক সহজ এবং নিরাপদ হয়ে ওঠে।
Content added By
Read more