উদাহরণ সহ জাভা প্রতিফলন API টিউটোরিয়াল

জাভাতে প্রতিফলন কি?

জাভা প্রতিফলন হল রানটাইমের সময় একটি শ্রেণীর সমস্ত ক্ষমতা বিশ্লেষণ এবং পরিবর্তন করার প্রক্রিয়া। জাভাতে রিফ্লেকশন এপিআই ব্যবহার করা হয় ক্লাস এবং এর সদস্যদের রানটাইম এ ক্ষেত্র, পদ্ধতি, কন্সট্রাকটর ইত্যাদি অন্তর্ভুক্ত করার জন্য।

জাভাতে প্রতিফলন API এর একটি সুবিধা হল, এটি ক্লাসের ব্যক্তিগত সদস্যদেরও হেরফের করতে পারে।

Java.lang.reflect প্যাকেজ প্রতিফলন জাভা বাস্তবায়নের জন্য অনেক ক্লাস প্রদান করে।

এই টিউটোরিয়ালে আপনি শিখবেন-

Java.lang.reflect প্যাকেজের ক্লাস

প্রতিফলন বাস্তবায়নের জন্য java.lang.package- এ বিভিন্ন জাভা ক্লাসের একটি তালিকা দেওয়া হল-

  • মাঠ : এই শ্রেণী ডেটাটাইপ, অ্যাক্সেস মডিফায়ার, নাম এবং ভেরিয়েবলের মত ঘোষণামূলক তথ্য সংগ্রহ করতে ব্যবহৃত হয়।
  • পদ্ধতি : অ্যাক্সেস সংশোধক, রিটার্ন টাইপ, নাম, প্যারামিটারের ধরন এবং একটি পদ্ধতির ব্যতিক্রম প্রকারের মতো ঘোষণামূলক তথ্য সংগ্রহ করতে এই ক্লাসটি ব্যবহার করা হয়।
  • নির্মাতা : এই শ্রেণীটি ঘোষণামূলক তথ্য সংগ্রহ করতে ব্যবহৃত হয় যেমন অ্যাক্সেস সংশোধনকারী, নাম এবং একজন নির্মাতার প্যারামিটারের ধরন।
  • পরিবর্তন করার : এই শ্রেণীটি একটি বিশেষ অ্যাক্সেস সংশোধনকারী সম্পর্কে তথ্য সংগ্রহ করতে ব্যবহৃত হয়।

Java.lang.Class এ ব্যবহৃত পদ্ধতি

  • পাবলিক স্ট্রিং getName () : ক্লাসের নাম প্রদান করে।
  • পাবলিক ক্লাস getSuperclass () : সুপার ক্লাস রেফারেন্স প্রদান করে
  • পাবলিক ক্লাস [] getInterfaces () : নির্দিষ্ট শ্রেণী দ্বারা বাস্তবায়িত ইন্টারফেসের একটি অ্যারে প্রদান করে
  • GetModifiers () এ সর্বজনীন: নির্দিষ্ট শ্রেণীর সংশোধনকারীদের প্রতিনিধিত্ব করে একটি পূর্ণসংখ্যা মান প্রদান করে যা 'তে একটি প্যারামিটার হিসাবে পাস করা প্রয়োজন পাবলিক স্ট্যাটিক স্ট্রিং টু স্ট্রিং (int i) ' পদ্ধতি যা প্রদত্ত শ্রেণীর জন্য অ্যাক্সেস স্পেসিফায়ার প্রদান করে।

কিভাবে একটি ক্লাস সম্পর্কে সম্পূর্ণ তথ্য পেতে হয়

একটি শ্রেণীর ভেরিয়েবল, পদ্ধতি এবং কনস্ট্রাক্টর সম্পর্কে তথ্য পেতে, আমাদের ক্লাসের একটি বস্তু তৈরি করতে হবে।

 public class Guru99ClassObjectCreation { public static void main (String[] args) throws ClassNotFoundException { //1 - By using Class.forname() method Class c1 = Class.forName('Guru99ClassObjectCreation'); //2- By using getClass() method Guru99ClassObjectCreation on2vhfObj = new Guru99ClassObjectCreation(); Class c2 = on2vhfObj.getClass(); //3- By using .class Class c3= Guru99ClassObjectCreation.class; } } 
  • নিম্নোক্ত উদাহরণটি ক্লাস 'ক্লাস' এর বস্তু তৈরির বিভিন্ন উপায় দেখায়:
  • উদাহরণ 1: ক্লাসের মেটাডেটা কিভাবে পাবেন

    নিম্নলিখিত উদাহরণ দেখায় কিভাবে মেটাডেটা পেতে হয় যেমন: ক্লাসের নাম, সুপার ক্লাসের নাম, বাস্তবায়িত ইন্টারফেস এবং একটি ক্লাসের অ্যাক্সেস মডিফায়ার।

    আমরা Guru99Base.class নামে নিচের ক্লাসের মেটাডেটা পাব:

     import java.io.Serializable; public abstract class Guru99Base implements Serializable,Cloneable { } 
    1. ক্লাসের নাম: Guru99Base
    2. এর অ্যাক্সেস সংশোধনকারী হল: সর্বজনীন এবং বিমূর্ত
    3. এটি ইন্টারফেস প্রয়োগ করেছে: সিরিয়ালাইজযোগ্য এবং ক্লোনযোগ্য
    4. যেহেতু এটি স্পষ্টভাবে কোন শ্রেণী প্রসারিত করেনি, তাই এটি সুপার ক্লাস হল: java.lang.Object
    ক্লাসের নীচে Guru99Base.class এর মেটা ডেটা পাবেন এবং প্রিন্ট করবেন:

     import java.lang.reflect.Modifier; public class Guru99GetclassMetaData { public static void main (String [] args) throws ClassNotFoundException { // Create Class object for Guru99Base.class Class on2vhfClassObj = Guru99Base.class; // Print name of the class system.out.println('Name of the class is : ' +on2vhfClassObj.getName()); // Print Super class name system.out.println('Name of the super class is : ' +on2vhfClassObj.getSuperclass().getName()); // Get the list of implemented interfaces in the form of Class array using getInterface() method class[] on2vhfInterfaceList = on2vhfclassObj.getInterfaces(); // Print the implemented interfaces using foreach loop system.out.print('Implemented interfaces are : '); for (Class on2vhfclass1 : quru99 InterfaceList) { system.out.print on2vhfclass1.getName() + ' '); } system.out.println(); //Get access modifiers using get Modifiers() method and toString() method of java.lang.reflect.Modifier class int on2vhfAccessModifier= on2vhfclassObj.getModifiers(); // Print the access modifiers System.Out.println('Access modifiers of the class are : ' +Modifier.tostring(on2vhfAccessModifier)); } } 
    1. getName পদ্ধতি ব্যবহার করে ক্লাসের নাম মুদ্রণ করুন
    2. GetSuperClass ()। GetName () পদ্ধতি ব্যবহার করে সুপার ক্লাসের নাম প্রিন্ট করুন
    3. বাস্তবায়িত ইন্টারফেসের নাম মুদ্রণ করুন
    4. ক্লাস দ্বারা ব্যবহৃত অ্যাক্সেস মোডিফায়ারগুলি মুদ্রণ করুন

    উদাহরণ 2: ভেরিয়েবলের মেটাডেটা কিভাবে পাবেন

    নিম্নলিখিত উদাহরণগুলি দেখায় কিভাবে ভেরিয়েবলের মেটাডেটা পাওয়া যায়:

    এখানে, আমরা কিছু ভেরিয়েবল সহ Guru99VariableMetaData .class নামে একটি ক্লাস তৈরি করছি: | _+_ | উপরের শ্রেণীর ভেরিয়েবল সম্পর্কে মেটাডেটা পাওয়ার ধাপ:

    1. উপরের ক্লাসের ক্লাস অবজেক্ট তৈরি করুন যেমন Guru99VariableMetaData.class নীচে: | _+_ |
    2. ব্যবহার করে ফিল্ড অ্যারে আকারে মেটাডেটা পান getFields () অথবা getDeclaredFields () নীচের পদ্ধতিগুলি: | _+_ |

    getFields () পদ্ধতি নির্দিষ্ট শ্রেণীর পাশাপাশি তার সুপার ক্লাস থেকে পাবলিক ভেরিয়েবলের মেটাডেটা ফেরত দেয়।

    getDeclaredFields () পদ্ধতি শুধুমাত্র নির্দিষ্ট শ্রেণী থেকে সমস্ত ভেরিয়েবলের মেটাডেটা প্রদান করে।

    1. 'পাবলিক স্ট্রিং getName ()' পদ্ধতি ব্যবহার করে ভেরিয়েবলের নাম পান।
    2. 'পাবলিক ক্লাস getType ()' পদ্ধতি ব্যবহার করে ভেরিয়েবলের ডেটাটাইপ পান।
    3. 'পাবলিক xxx গেট (ফিল্ড)' পদ্ধতি ব্যবহার করে ভেরিয়েবলের মান পান।

      এখানে, xxx একটি বাইট বা সংক্ষিপ্ত হতে পারে যে কোন ধরনের মান আমরা আনতে চাই।

    4. GetModifier () এবং Modifier.toString (int i) পদ্ধতি ব্যবহার করে ভেরিয়েবলের অ্যাক্সেস সংশোধনকারী পান।

      এখানে, আমরা Guru99VariableMetaData .class- এ উপস্থিত ভেরিয়েবলের মেটাডেটা পেতে একটি ক্লাস লিখছি:

       package guru; public class Guru99VariableMetaData { public static int on2vhfIntVar1=1111; static int on2vhfIntVar2=2222; static String on2vhfStringVar1='on2vhf.be'; static String on2vhfStringVar2='Learning Reflection API'; } 
      1. Guru99VariableMetaData.class এর জন্য ক্লাস অবজেক্ট তৈরি করা হয়েছে
      2. একটি ফিল্ড অ্যারে ভেরিয়েবলের সমস্ত মেটাডেটা পেয়েছি
      3. Guru99VariableMetaData.class ক্লাসে সব ভেরিয়েবলের নাম প্রিন্ট করা হয়েছে
      4. Guru99VariableMetaData.class ক্লাসে ভেরিয়েবলের সব ধরনের ডেটা প্রিন্ট করা হয়েছে
      5. Guru99VariableMetaData.class ক্লাসে ভেরিয়েবলের সকল অ্যাক্সেস মডিফায়ার প্রিন্ট করা হয়েছে
      6. ক্লাসের সব ভেরিয়েবলের প্রিন্ট করা মানগুলি ক্লাসে গুরু 99 ভ্যারিয়েবল মেটাডাটা ক্লাসে মুদ্রিত

      উদাহরণ 3: পদ্ধতিটির মেটাডেটা কিভাবে পাবেন

      নিম্নলিখিত উদাহরণ দেখায় কিভাবে একটি পদ্ধতির মেটাডেটা পেতে হয়:

      এখানে, আমরা কিছু পদ্ধতি সহ Guru99MethodMetaData .class নামে একটি ক্লাস তৈরি করছি

       Guru99VariableMetaData on2vhfClassVar = new Guru99VariableMetaData(); Class on2vhfClassObjVar = on2vhfClassVar.getClass();

      উপরের শ্রেণীর পদ্ধতি সম্পর্কে মেটাডেটা পাওয়ার ধাপ:

      1. উপরের ক্লাসের ক্লাস অবজেক্ট তৈরি করুন যেমন Guru99MethodMetaData.class নীচে: | _+_ |
      2. GetMethods () এবং getDeclaredMethods () পদ্ধতি ব্যবহার করে একটি পদ্ধতি অ্যারে পদ্ধতি তথ্য পান: | _+_ |

        getMethods () পদ্ধতি নির্দিষ্ট শ্রেণীর পাশাপাশি তার সুপার ক্লাস থেকে সর্বজনীন পদ্ধতির মেটাডেটা ফেরত দেয়।

        getDeclaredMethods () পদ্ধতি শুধুমাত্র নির্দিষ্ট শ্রেণী থেকে সমস্ত পদ্ধতির মেটাডেটা প্রদান করে।

      3. ব্যবহার করে পদ্ধতির নাম পান getName () পদ্ধতি
      4. পদ্ধতি ব্যবহার করে রিটার্ন টাইপ পান getReturnType () পদ্ধতি
      5. ব্যবহার পদ্ধতিগুলির অ্যাক্সেস সংশোধনকারী পান getModifiers () এবং Modifiers.toString (int i) পদ্ধতি
      6. পদ্ধতি প্যারামিটার প্রকার ব্যবহার করে পান getParameterTypes () পদ্ধতি যা একটি ক্লাস অ্যারে প্রদান করে।
      7. ব্যবহার করে নিক্ষিপ্ত ব্যতিক্রম পান getExceptionTypes () পদ্ধতি যা একটি ক্লাস অ্যারে প্রদান করে।

      এখানে, আমরা ক্লাস Guru99MethodMetaData.class এ উপস্থিত পদ্ধতিগুলির মেটাডেটা পেতে একটি ক্লাস লিখছি:

      Field[] on2vhfField1= on2vhfClassObjVar .getFields(); Field[] on2vhfFiel2= on2vhfClassObjVar .getDeclaredFields();
      1. Guru99MethodMetaData.class এর জন্য ক্লাস অবজেক্ট তৈরি করা হয়েছে
      2. একটি পদ্ধতি অ্যারে সব পদ্ধতির সমস্ত মেটাডেটা পেয়েছি
      3. Guru99MethodMetaData.class শ্রেণীতে উপস্থিত সমস্ত পদ্ধতির নাম মুদ্রিত
      4. শ্রেণী Guru99MethodMetaData.class এ প্রিন্ট করা রিটার্ন টাইপের পদ্ধতি
      5. Guru99MethodMetaData.class ক্লাসে পদ্ধতিগুলির সমস্ত অ্যাক্সেস সংশোধনকারী মুদ্রিত
      6. Guru99MethodMetaData.class- এর পদ্ধতিগুলির প্রিন্ট করা প্যারামিটার প্রকার
      7. Guru99MethodMetaData.class- এ পদ্ধতি দ্বারা মুদ্রিত ব্যতিক্রমগুলি নিক্ষেপ করা হয়

      উদাহরণ 4: কনস্ট্রাকটরদের মেটাডেটা কিভাবে পাবেন

      নিম্নলিখিত উদাহরণগুলি দেখায় কিভাবে কনস্ট্রাক্টরদের মেটাডেটা পেতে হয়:

      এখানে, আমরা বিভিন্ন নির্মাতাদের সাথে Guru99Constructor.class নামে একটি ক্লাস তৈরি করছি:

       package guru; import java.lang.reflect.Field; public class Guru99VariableMetaDataTest { public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException { // Create Class object for Guru99VariableMetaData.class Guru99VariableMetaData on2vhfClassVar = new Guru99VariableMetaData(); Class on2vhfClassObjVar = on2vhfClassVar.getClass(); // Get the metadata of all the fields of the class Guru99VariableMetaData Field[] on2vhfField1= on2vhfClassObjVar.getDeclaredFields(); // Print name, datatypes, access modifiers and values of the varibales of the specified class for(Field field : on2vhfField1) { System.out.println('Variable name : '+field.getName()); System.out.println('Datatypes of the variable :'+field.getType()); int on2vhfAccessModifiers = field.getModifiers(); System.out.printlln('Access Modifiers of the variable : '+Modifier.toString(on2vhfAccessModifiers)); System.out.println('Value of the variable : '+field.get(on2vhfClassVar)); System.out.println(); system.out.println('* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *') ; } } } 

      এখানে, আমরা Guru99Constructor.class ক্লাসে উপস্থিত কনস্ট্রাক্টরদের মেটাডেটা পেতে একটি ক্লাস লিখছি:

       package guru; import java.sql.SQLException; public class Guru99MethodMetaData { public void on2vhfAdd(int firstElement, int secondElement , String result) throws ClassNotFoundException, ClassCastException{ System.out.println('Demo method for Reflextion API'); } public String on2vhfSearch(String searchString) throws ArithmeticException, InterruptedException{ System.out.println('Demo method for Reflection API'); return null; } public void on2vhfDelete(String deleteString) throws SQLException{ System.out.println('Demo method for Reflection API'); } } 
      1. Guru99Constructor.class এর জন্য ক্লাস অবজেক্ট তৈরি করা হয়েছে
      2. একটি কনস্ট্রাক্টর অ্যারেতে সমস্ত কনস্ট্রাক্টরের সমস্ত মেটাডেটা পেয়েছি
      3. Guru99Constructor.class ক্লাসে উপস্থিত সকল কনস্ট্রাক্টরের নাম মুদ্রিত
      4. Guru99Constructor.class ক্লাসে কন্সট্রাকটরদের সকল অ্যাক্সেস মডিফায়ার প্রিন্ট করা হয়েছে
      5. Guru99Constructor.class- এ নির্মাতাদের প্রিন্ট করা প্যারামিটার প্রকার
      6. Guru99Constructor.class এ কন্সট্রাকটরদের দ্বারা মুদ্রিত ব্যতিক্রমগুলি নিক্ষেপ করা হয়

      সারসংক্ষেপ:

      • জাভাতে প্রতিফলন প্রোগ্রামিং ক্লাস এবং ক্লাসের সদস্যদের পরিবর্তনশীল, পদ্ধতি, কন্সট্রাকটর সম্পর্কে তথ্য পুনরুদ্ধার এবং পরিবর্তন করতে সাহায্য করে।
      • Java.lang.reflect প্যাকেজের ক্লাস এবং java.lang.Class ক্লাসের পদ্ধতি ব্যবহার করে জাভাতে প্রতিফলন API প্রয়োগ করা যেতে পারে।
      • Java.lang.Class শ্রেণীর কিছু সাধারণভাবে ব্যবহৃত পদ্ধতি হল getName (), getSuperclass (), getInterfaces (), getModifiers () ইত্যাদি।
      • Java.lang.reflect প্যাকেজে সাধারণভাবে ব্যবহৃত কিছু ক্লাস হল ফিল্ড, মেথড, কনস্ট্রাকটর, মডিফায়ার ইত্যাদি।
      • প্রতিফলন API একটি শ্রেণীর ব্যক্তিগত পদ্ধতি এবং ভেরিয়েবল অ্যাক্সেস করতে পারে যা নিরাপত্তার জন্য হুমকি হতে পারে।
      • প্রতিফলন API জাভা দ্বারা সরবরাহ করা একটি শক্তিশালী ক্ষমতা, কিন্তু এটি কিছু ওভারহেড যেমন ধীর কর্মক্ষমতা, নিরাপত্তা দুর্বলতা এবং অনুমতি সমস্যা নিয়ে আসে। অতএব, একটি অপারেশন করার জন্য প্রতিফলন API কে শেষ অবলম্বন হিসাবে বিবেচনা করা উচিত।