java - সরণ - প্রতিফলন কোণ কাকে বলে




প্রতিফলন কি এবং কেন এটা দরকারী? (14)

প্রতিফলন কি, এবং কেন এটা দরকারী?

আমি বিশেষ করে জাভাতে আগ্রহী, তবে আমি অনুমান করি যে নীতিগুলি কোনও ভাষায় একই।


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

উদাহরণস্বরূপ, জাভাতে থাকা সমস্ত বস্তুগুলির মধ্যে getClass() , যা আপনাকে কম্পাইল সময় (যেমন আপনি যদি এটি একটি Object হিসাবে ঘোষণা করেন) এমনকি যদি এটি বস্তুর শ্রেণী নির্ধারণ করতে দেয় তবে এটি ক্ষুদ্র মনে হতে পারে তবে C++ হিসাবে কম গতিশীল ভাষাগুলিতে প্রতিফলন সম্ভব নয়। আরো উন্নত ব্যবহারগুলি আপনাকে তালিকা এবং কল পদ্ধতি, কন্সট্রাক্টর ইত্যাদি দেয়।

প্রতিফলনটি গুরুত্বপূর্ণ কারণ এটি আপনাকে এমন প্রোগ্রামগুলি লিখতে দেয় যা কম্পাইল করার সময় সবকিছু "জানেন" না, তাদের আরও গতিশীল করে তোলে, কারণ তারা রানটাইম এ একত্রিত হতে পারে। কোডটি পরিচিত ইন্টারফেসের বিরুদ্ধে লেখা যেতে পারে, তবে ব্যবহারযোগ্য প্রকৃত ক্লাস কনফিগারেশন ফাইলগুলির প্রতিফলন ব্যবহার করে তাত্ক্ষণিকভাবে চালু করা যেতে পারে।

আধুনিক কাঠামো প্রচুর এই কারণে খুব ব্যাপকভাবে প্রতিফলন ব্যবহার। বেশিরভাগ অন্যান্য আধুনিক ভাষাগুলি প্রতিফলন ব্যবহার করে এবং স্ক্রিপ্টিং ভাষাগুলিতে (যেমন পাইথন) তারা আরও শক্তভাবে সংহত হয়, কারণ এটি সেই ভাষাগুলির সাধারণ প্রোগ্রামিং মডেলের মধ্যে আরও বেশি প্রাকৃতিক মনে করে।


আমার বোঝার হিসাবে:

প্রতিফলন প্রোগ্রামার গতিশীল প্রোগ্রামে সত্তা অ্যাক্সেস করতে পারবেন। অর্থাৎ প্রোগ্রামার যদি কোন শ্রেণী বা তার পদ্ধতি সম্পর্কে অবগত না হন তবে একটি অ্যাপ্লিকেশন কোডিং করার সময়, সে প্রতিফলন ব্যবহার করে গতিশীলভাবে (রান সময়) এই শ্রেণী ব্যবহার করতে পারে।

এটি ঘন ঘন পরিবর্তন একটি শ্রেণী নাম যেখানে পরিস্থিতিতে প্রায়ই ব্যবহৃত হয়। যদি এমন পরিস্থিতির সৃষ্টি হয় তবে প্রোগ্রামারটির আবেদনটি পুনরায় লিখতে এবং বার বার ক্লাসটির নাম পরিবর্তন করতে জটিল।

পরিবর্তে, প্রতিফলন ব্যবহার করে, সম্ভবত একটি পরিবর্তনশীল শ্রেণীর নাম সম্পর্কে চিন্তা করার প্রয়োজন আছে।


উদাহরণ:
উদাহরণস্বরূপ একটি দূরবর্তী অ্যাপ্লিকেশন নিন যা আপনার অ্যাপ্লিকেশনটিকে তাদের API পদ্ধতিগুলি ব্যবহার করে প্রাপ্ত একটি বস্তু দেয়। এখন অবজেক্টের উপর ভিত্তি করে আপনাকে কিছু ধরণের গণনা করার প্রয়োজন হতে পারে।
সরবরাহকারীটি 3 ধরণের হতে পারে এবং গ্যারান্টিটি কোনও বস্তুর উপর ভিত্তি করে গণনা করতে হবে তা নিশ্চিত করে।
সুতরাং আমরা 3 টি শ্রেণিতে প্রতিটি পৃথক লজিক প্রয়োগ করতে পারি। প্রকৃতপক্ষে বস্তুর তথ্য রানটাইমতে পাওয়া যায় যাতে আপনি গণনা সম্পাদন করতে স্থিরভাবে কোড করতে পারেন না, তাই প্রতিফলনটি ক্লাসের অবজেক্টটি তাত্ক্ষণিকভাবে প্রয়োগ করতে ব্যবহার করা হয় যা আপনার উপর ভিত্তি করে গণনা সম্পাদন করতে প্রয়োজন সরবরাহকারী থেকে প্রাপ্ত বস্তু।


জাভা ডকুমেন্টেশন page

java.lang.reflect প্যাকেজ ক্লাস এবং অবজেক্ট সম্পর্কে প্রতিফলিত তথ্য প্রাপ্ত করার জন্য ক্লাস এবং ইন্টারফেস সরবরাহ করে। প্রতিফলন, সুরক্ষা বিধিনিষেধের মধ্যে তাদের অন্তর্নিহিত সমতুল্যগুলিতে কাজ করার জন্য ক্ষেত্র, পদ্ধতি এবং লোড হওয়া শ্রেণির কন্সট্রকটর এবং প্রতিফলিত ক্ষেত্র, পদ্ধতি এবং কন্সট্রকটারগুলির ব্যবহার সম্পর্কে প্রোগ্রাম্যাটিক অ্যাক্সেসের অনুমতি দেয়।

AccessibleObject যদি প্রয়োজনীয় ReflectPermission উপলব্ধ থাকে তাহলে অ্যাক্সেস চেকগুলির দমনের অনুমতি দেয়।

java.lang.Class সহ এই প্যাকেজগুলির ক্লাসগুলি ডিবাগার, দোভাষী, বস্তু পরিদর্শক, বর্গ ব্রাউজার এবং Object Serialization এবং JavaBeans মতো অ্যাপ্লিকেশনগুলিকে মঞ্জুরি দেয় যার জন্য লক্ষ্যবস্তু বস্তুর জনসাধারণের অ্যাক্সেস প্রয়োজন। রানটাইম ক্লাস) বা একটি নির্দিষ্ট শ্রেণীর দ্বারা ঘোষিত সদস্য

এটা নিম্নলিখিত কার্যকারিতা অন্তর্ভুক্ত।

  1. ক্লাস বস্তু প্রাপ্তি,
  2. একটি বর্গ (ক্ষেত্র, পদ্ধতি, নির্মাতারা) বৈশিষ্ট্য পরীক্ষা করা,
  3. সেট এবং ক্ষেত্রের মান পেয়ে,
  4. পদ্ধতি আহ্বান,
  5. বস্তুর নতুন দৃষ্টান্ত তৈরি করা।

Class বর্গ দ্বারা উন্মুক্ত পদ্ধতির জন্য এই documentation লিঙ্কটি দেখুন।

এই article থেকে (ডেনিস সোসনোস্কি, রাষ্ট্রপতি, সোসনোস্কি সফটওয়্যার সলিউশনস ইনকর্পোরেটেড দ্বারা) এবং এই article (নিরাপত্তা-অনুসন্ধানগুলি পিডিএফ):

আমি প্রতিফলন ব্যবহার করে তুলনায় উল্লেখযোগ্য ত্রুটি দেখতে পারেন

প্রতিফলনের ব্যবহারকারী:

  1. এটি গতিশীলভাবে প্রোগ্রাম উপাদান লিঙ্ক খুব বহুমুখী উপায় উপলব্ধ করা হয়
  2. এটি লাইব্রেরি তৈরির জন্য খুবই উপকারী যা বস্তুর সাথে খুব সাধারণ উপায়ে কাজ করে

প্রতিফলন এর drawbacks:

  1. ক্ষেত্র এবং পদ্ধতি অ্যাক্সেস জন্য ব্যবহৃত যখন প্রতিফলন সরাসরি কোড তুলনায় অনেক ধীর।
  2. এটা আসলে আপনার কোড ভিতরে কি যাচ্ছে অস্পষ্ট করতে পারেন
  3. এটি সোর্স কোড বাইপাস রক্ষণাবেক্ষণ সমস্যা তৈরি করতে পারেন
  4. প্রতিফলন কোড সংশ্লিষ্ট সরাসরি কোড তুলনায় আরো জটিল
  5. এটি ডেটা অ্যাক্সেস সুরক্ষা এবং টাইপ নিরাপত্তা হিসাবে কী জাভা সুরক্ষা সীমাবদ্ধতা লঙ্ঘন করে

সাধারণ অপব্যবহার:

  1. সীমিত ক্লাস লোড হচ্ছে,
  2. একটি সীমাবদ্ধ বর্গ নির্মাতারা, পদ্ধতি বা ক্ষেত্রের রেফারেন্স প্রাপ্ত,
  3. নতুন বস্তুর দৃষ্টান্ত, পদ্ধতি আহরণ, একটি সীমিত শ্রেণির ক্ষেত্রের মানগুলি প্রাপ্ত বা সেট করা।

প্রতিফলন বৈশিষ্ট্য অপব্যবহার সম্পর্কিত এই এসই প্রশ্নটি দেখুন:

কিভাবে আমি জাভা একটি ব্যক্তিগত ক্ষেত্র পড়তে পারি?

সারাংশ:

একটি সিস্টেম কোডের মধ্যে থেকে পরিচালিত তার ক্রিয়াকলাপগুলির অনিরাপদ ব্যবহার সহজেই জাভা সুরক্ষা মোডের আপোসের দিকে পরিচালিত করতে পারেতাই sparingly এই বৈশিষ্ট্য ব্যবহার করুন


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

একটি দ্রুত জাভা প্রতিফলন উদাহরণ আপনাকে প্রতিফলন ব্যবহার করে কি দেখাচ্ছে তা দেখানোর জন্য:

Method[] methods = MyObject.class.getMethods();

    for(Method method : methods){
        System.out.println("method = " + method.getName());
    }

এই উদাহরণটি ক্লাসের বস্তুটি মাইওবেক্ট নামে পরিচিত করে। ক্লাস অবজেক্ট ব্যবহার করে উদাহরণটি সেই শ্রেণির পদ্ধতিগুলির একটি তালিকা পায়, পদ্ধতিগুলিকে পুনরাবৃত্তি করে এবং তাদের নাম মুদ্রণ করে।

এই সব কাজ এখানে ব্যাখ্যা করা হয় ঠিক কিভাবে

সম্পাদনা : প্রায় 1 বছর পর আমি এই উত্তরটি সম্পাদনা করছি যখন প্রতিফলন সম্পর্কে পড়ার সময় আমি প্রতিফলনের আরও কিছু ব্যবহার করেছি।

  • বসন্ত যেমন বীন কনফিগারেশন ব্যবহার করে:


<bean id="someID" class="com.example.Foo">
    <property name="someField" value="someValue" />
</bean>

যখন স্প্রিং প্রসঙ্গটি এই <বিয়ান> উপাদানটি প্রক্রিয়া করে, তখন সে ক্লাসটি তাত্ক্ষণিক করার জন্য "com.example.Foo" যুক্তি সহ ক্লাস.ফোরনাম (স্ট্রিং) ব্যবহার করবে।

এটি আবার <property> উপাদানটির জন্য উপযুক্ত সেটার পেতে প্রতিফলন ব্যবহার করবে এবং নির্দিষ্ট মানতে তার মান সেট করবে।

  • Junit বিশেষ করে ব্যক্তিগত / সুরক্ষিত পদ্ধতি পরীক্ষা করার জন্য প্রতিফলন ব্যবহার করে।

ব্যক্তিগত পদ্ধতির জন্য,

Method method = targetClass.getDeclaredMethod(methodName, argClasses);
method.setAccessible(true);
return method.invoke(targetObject, argObjects);

ব্যক্তিগত ক্ষেত্রের জন্য,

Field field = targetClass.getDeclaredField(fieldName);
field.setAccessible(true);
field.set(object, value);

নাম প্রতিফলন কোডটি বর্ণনা করার জন্য ব্যবহৃত হয় যা একই সিস্টেমের (অথবা নিজেই) অন্য কোড পরিদর্শন করতে সক্ষম।

উদাহরণস্বরূপ, বলুন আপনার জাভাতে একটি অজানা টাইপের একটি বস্তু আছে এবং আপনি যদি এটি বিদ্যমান থাকেন তবে এটিতে 'ডসসমিংথ' পদ্ধতিটি কল করতে চান। জাভা স্ট্যাটিক টাইপিং সিস্টেমটি আসলে এটি সমর্থন করার জন্য ডিজাইন করা হয় না যদি না বস্তু কোনও পরিচিত ইন্টারফেসের সাথে মিলিত হয় তবে প্রতিফলন ব্যবহার করে আপনার কোডটি বস্তুর দিকে নজর রাখতে পারে এবং এটি 'ডসোমিথিং' নামে একটি পদ্ধতি আছে কিনা তা খুঁজে বের করে এবং তারপর কল করুন চাই.

তাই, জাভাতে এটির একটি কোড উদাহরণ দেওয়ার জন্য (প্রশ্নে বস্তুর কল্পনা করুন foo):

Method method = foo.getClass().getMethod("doSomething", null);
method.invoke(foo, null);

জাভা একটি খুব সাধারণ ব্যবহার ক্ষেত্রে এনটাইটেশন সঙ্গে ব্যবহার। JUnit 4, উদাহরণস্বরূপ, @Test টীকাটি দিয়ে ট্যাগ করা পদ্ধতিগুলির জন্য আপনার ক্লাসগুলিকে দেখতে প্রতিফলন ব্যবহার করবে এবং তখন ইউনিট পরীক্ষা চলাকালীন তাদের কল করবে।

http://docs.oracle.com/javase/tutorial/reflect/index.html এ আপনি শুরু করতে কিছু ভাল প্রতিফলন উদাহরণ আছে।

এবং অবশেষে, হ্যাঁ, ধারণার অন্যান্য স্ট্যাটিকালি ধরনের ভাষাগুলিতে বেশ অনুরূপ যা প্রতিফলন সমর্থন করে (যেমন C #)। গতিশীলভাবে টাইপ করা ভাষাগুলিতে, উপরে বর্ণিত ব্যবহারের ক্ষেত্রে কম প্রয়োজনীয় (কম্পাইলার কোনও বস্তুতে যে কোনও পদ্ধতিতে কল করার অনুমতি দেবে, যদি এটি উপস্থিত না থাকে তবে রানটাইম এ ব্যর্থ হয়), তবে চিহ্নিত পদ্ধতিগুলির সন্ধানের দ্বিতীয় ক্ষেত্রে বা একটি নির্দিষ্ট ভাবে কাজ এখনও সাধারণ।

একটি মন্তব্য থেকে আপডেট করুন:

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


প্রতি ভাষা প্রতিফলন সমর্থন করে না কিন্তু নীতিগুলি সাধারণত সমর্থন করে এমন ভাষাগুলির মধ্যে একই।

প্রতিফলন আপনার প্রোগ্রামের কাঠামোর "প্রতিফলিত" করার ক্ষমতা। অথবা আরো কংক্রিট। আপনার কাছে থাকা বস্তুগুলি এবং ক্লাসগুলির দিকে নজর দেওয়ার জন্য এবং প্রোগ্রামটি পদ্ধতিগুলি, ক্ষেত্রগুলি এবং ইন্টারফেসগুলিকে বাস্তবায়িত করার বিষয়ে তথ্য ফিরে পেতে। আপনি টীকা মত জিনিস তাকান করতে পারেন।

এটা অনেক পরিস্থিতিতে usefull। সর্বত্র আপনি গতিশীলভাবে আপনার কোড মধ্যে ক্লাসে প্লাগ করতে সক্ষম হতে চান। লট অফ অবজেক্ট রিলেশনাল ম্যাপাররা কোন অবজেক্টগুলি ব্যবহার করতে যাচ্ছেন তা আগাম জানার আগে ডেটাবেস থেকে বস্তুগুলি তাত্ক্ষণিক করতে প্রতিফলন ব্যবহার করে। প্লাগ-ইন আর্কিটেকচারগুলি অন্য স্থান যেখানে প্রতিফলনটি কার্যকর। গতিশীলভাবে কোডটি লোড করতে এবং প্লাগইন হিসাবে ব্যবহার করার জন্য সঠিক ইন্টারফেস বাস্তবায়নের যে ধরণের আছে তা নির্ধারণ করতে সক্ষম হ'ল সেই পরিস্থিতিতে গুরুত্বপূর্ণ।


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


প্রতিফলন জন্য সহজ উদাহরণ। একটি দাবা খেলা, আপনি রান সময় সময়ে ব্যবহারকারী দ্বারা কি সরানো হবে তা জানি না। প্রতিফলন ইতিমধ্যে রান সময় প্রয়োগ করা হয় যা পদ্ধতি কল করতে ব্যবহার করা যেতে পারে।

public class Test {

    public void firstMoveChoice(){
        System.out.println("First Move");
    } 
    public void secondMOveChoice(){
        System.out.println("Second Move");
    }
    public void thirdMoveChoice(){
        System.out.println("Third Move");
    }

    public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { 
        Test test = new Test();
        Method[] method = test.getClass().getMethods();
        //firstMoveChoice
        method[0].invoke(test, null);
        //secondMoveChoice
        method[1].invoke(test, null);
        //thirdMoveChoice
        method[2].invoke(test, null);
    }

}

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

Class myObjectClass = MyObject.class;
Method[] method = myObjectClass.getMethods();

//Here the method takes a string parameter if there is no param, put null.
Method method = aClass.getMethod("method_name", String.class); 

Object returnValue = method.invoke(null, "parameter-value1");

উপরের উদাহরণে নিল প্যারামিটারটি এমন বস্তু যা আপনি পদ্ধতিটি আহ্বান করতে চান। পদ্ধতি স্ট্যাটিক আপনি নাল সরবরাহ করা হয়। পদ্ধতিটি স্ট্যাটিক না থাকলে, আপনাকে আহ্বান করার সময় নল পরিবর্তে একটি বৈধ মাইওবেজেন্ট ইনস্ট্যান্স সরবরাহ করতে হবে।

প্রতিফলন আপনাকে একটি ক্লাসের ব্যক্তিগত সদস্য / পদ্ধতিগুলি অ্যাক্সেস করার অনুমতি দেয়:

public class A{

  private String str= null;

  public A(String str) {
  this.str= str;
  }
}

A obj= new A("Some value");

Field privateStringField = A.class.getDeclaredField("privateString");

//Turn off access check for this field
privateStringField.setAccessible(true);

String fieldValue = (String) privateStringField.get(obj);
System.out.println("fieldValue = " + fieldValue);
  • ক্লাস পরিদর্শনের জন্য (অন্তর্নিবেশ হিসাবেও পরিচিত) আপনাকে প্রতিফলন প্যাকেজ আমদানি করতে হবে না ( java.lang.reflect )। ক্লাস মেটাডাটা java.lang.Class মাধ্যমে অ্যাক্সেস করা যেতে পারে।

প্রতিফলনটি অত্যন্ত শক্তিশালী API তবে অতিরিক্ত ব্যবহার করলে এটি হ্রাস করা হতে পারে, কারণ এটি রানটাইমগুলিতে সমস্ত ধরণের সমাধান করে।


প্রতিফলন বস্তু তাদের চেহারা দেখতে দেওয়া হয়। এই যুক্তি প্রতিফলন সঙ্গে কিছুই মনে হয়। আসলে, এই "স্ব-সনাক্তকরণ" ক্ষমতা।

প্রতিফলন নিজেই এমন ভাষাগুলির জন্য একটি শব্দ যা স্ব-জ্ঞান এবং জাভা এবং সি # হিসাবে স্ব-সংবেদনশীলতার অভাব রয়েছে। কারণ তাদের স্ব-জ্ঞানের ক্ষমতা নেই, যখন আমরা এটি কেমন দেখি তা পর্যবেক্ষণ করতে চাই, তখন আমাদের কেমন লাগছে তা প্রতিফলিত করতে অন্য একটি জিনিস থাকতে হবে। রুবি এবং পাইথন হিসাবে চমৎকার গতিশীল ভাষা অন্যান্য ব্যক্তিদের সাহায্য ছাড়া তাদের নিজস্ব প্রতিফলন বুঝতে পারেন। আমরা বলতে পারি যে জাভা অবজেক্টটি আয়না ব্যতীত দেখতে কেমন অনুভব করতে পারে না, যা প্রতিফলন বর্গের একটি বস্তু, তবে পাইথনের একটি বস্তু আয়না ছাড়াই এটি বুঝতে পারে। তাই আমরা জাভা প্রতিফলন প্রয়োজন কেন।


প্রতিফলনের আমার প্রিয় ব্যবহারগুলির মধ্যে একটি নীচের জাভা ডাম্প পদ্ধতি। এটি একটি প্যারামিটার হিসাবে কোনও বস্তু নেয় এবং জাভা প্রতিফলন API প্রতিটি ক্ষেত্রের নাম এবং মান মুদ্রণ করে।

import java.lang.reflect.Array;
import java.lang.reflect.Field;

public static String dump(Object o, int callCount) {
    callCount++;
    StringBuffer tabs = new StringBuffer();
    for (int k = 0; k < callCount; k++) {
        tabs.append("\t");
    }
    StringBuffer buffer = new StringBuffer();
    Class oClass = o.getClass();
    if (oClass.isArray()) {
        buffer.append("\n");
        buffer.append(tabs.toString());
        buffer.append("[");
        for (int i = 0; i < Array.getLength(o); i++) {
            if (i < 0)
                buffer.append(",");
            Object value = Array.get(o, i);
            if (value.getClass().isPrimitive() ||
                    value.getClass() == java.lang.Long.class ||
                    value.getClass() == java.lang.String.class ||
                    value.getClass() == java.lang.Integer.class ||
                    value.getClass() == java.lang.Boolean.class
                    ) {
                buffer.append(value);
            } else {
                buffer.append(dump(value, callCount));
            }
        }
        buffer.append(tabs.toString());
        buffer.append("]\n");
    } else {
        buffer.append("\n");
        buffer.append(tabs.toString());
        buffer.append("{\n");
        while (oClass != null) {
            Field[] fields = oClass.getDeclaredFields();
            for (int i = 0; i < fields.length; i++) {
                buffer.append(tabs.toString());
                fields[i].setAccessible(true);
                buffer.append(fields[i].getName());
                buffer.append("=");
                try {
                    Object value = fields[i].get(o);
                    if (value != null) {
                        if (value.getClass().isPrimitive() ||
                                value.getClass() == java.lang.Long.class ||
                                value.getClass() == java.lang.String.class ||
                                value.getClass() == java.lang.Integer.class ||
                                value.getClass() == java.lang.Boolean.class
                                ) {
                            buffer.append(value);
                        } else {
                            buffer.append(dump(value, callCount));
                        }
                    }
                } catch (IllegalAccessException e) {
                    buffer.append(e.getMessage());
                }
                buffer.append("\n");
            }
            oClass = oClass.getSuperclass();
        }
        buffer.append(tabs.toString());
        buffer.append("}\n");
    }
    return buffer.toString();
}

প্রতিফলন ব্যবহার

প্রতিফলন সাধারণত প্রোগ্রাম দ্বারা ব্যবহৃত হয় যা জাভা ভার্চুয়াল মেশিনে চলমান অ্যাপ্লিকেশনগুলির রানটাইম আচরণ পরীক্ষা বা সংশোধন করার ক্ষমতা প্রয়োজন। এটি একটি অপেক্ষাকৃত উন্নত বৈশিষ্ট্য এবং শুধুমাত্র সেই ডেভেলপারদের দ্বারা ব্যবহার করা উচিত যারা ভাষাগুলির মূলনীতিগুলি দৃঢ়ভাবে উপলব্ধি করে। যে ক্যাভিট মনের সাথে, প্রতিফলন একটি শক্তিশালী কৌশল এবং অ্যাপ্লিকেশনগুলিকে অপারেশন করতে সক্ষম করতে পারে যা অন্যথায় অসম্ভব হবে।

এক্সটেনসিবলি বৈশিষ্ট্য

একটি অ্যাপ্লিকেশন তাদের পুরোপুরি যোগ্য নাম ব্যবহার করে এক্সটেনসিবলি অবজেক্টের উদাহরণ তৈরি করে বাইরের, ব্যবহারকারী-সংজ্ঞায়িত ক্লাসগুলির ব্যবহার করতে পারে। ক্লাস ব্রাউজার এবং ভিজ্যুয়াল ডেভেলপমেন্ট এনভায়রনমেন্ট ক্লাস ক্লাসের সদস্যদের শ্রেণীসংখ্যা করতে সক্ষম হওয়া দরকার। ভিজ্যুয়াল ডেভেলপমেন্ট এনভায়রনমেন্টগুলি সঠিক কোড লেখার বিকাশকারীকে সহায়তা করার জন্য প্রতিফলনে উপলব্ধ তথ্যের তথ্য ব্যবহার থেকে উপকৃত হতে পারে। ডিবাগার এবং টেস্ট সরঞ্জাম ডিবাগারদের ক্লাসে ব্যক্তিগত সদস্যদের পরীক্ষা করতে সক্ষম হতে হবে। পরীক্ষার harnesses একটি পরীক্ষা স্যুট একটি উচ্চ স্তরের কোড কভারেজ নিশ্চিত করতে, একটি বর্গ সংজ্ঞায়িত একটি আবিষ্কারযোগ্য সেট APIs systematically কল প্রতিফলিত ব্যবহার করতে পারেন।

প্রতিফলন এর drawbacks

প্রতিফলন শক্তিশালী, কিন্তু নির্বিচারে ব্যবহার করা উচিত নয়। প্রতিফলন ব্যবহার না করে অপারেশন সঞ্চালন করা সম্ভব হলে, এটি ব্যবহার করা এড়ানোর পক্ষে আরও ভাল। প্রতিফলন মাধ্যমে কোড অ্যাক্সেস করার সময় নিম্নলিখিত উদ্বেগ মন রাখা উচিত।

  • কর্মক্ষমতা ওভারহেড

প্রতিফলন গতিশীলভাবে সমাধান করা হয় এমন ধরনের অন্তর্ভুক্ত, কিছু জাভা ভার্চুয়াল মেশিন অপ্টিমাইজেশান সঞ্চালিত করা যাবে না। ফলস্বরূপ, প্রতিফলিত ক্রিয়াকলাপগুলি তাদের অ-প্রতিক্রিয়াশীল সমতুল্যগুলির তুলনায় ধীর কর্মক্ষমতা দেয় এবং কোডের বিভাগগুলিতে এড়ানো উচিত যা কার্য সম্পাদন-সংবেদনশীল অ্যাপ্লিকেশনগুলিতে ঘন ঘন বলা হয়।

  • নিরাপত্তা নিষেধাজ্ঞা

প্রতিফলনের জন্য একটি রানটাইম অনুমতি প্রয়োজন যা নিরাপত্তা ব্যবস্থাপকের অধীনে চলাকালীন উপস্থিত হতে পারে না। এটি কোডের জন্য একটি গুরুত্বপূর্ণ বিবেচনার বিষয় যা একটি সীমাবদ্ধ নিরাপত্তা প্রেক্ষাপটে চালানো উচিত, যেমন একটি অ্যাপলেটের মধ্যে।

  • অভ্যন্তরীণ এক্সপোজার

যেহেতু প্রতিফলন কোডগুলি এমন কার্য সম্পাদন করার অনুমতি দেয় যা বেসরকারী ক্ষেত্রগুলি এবং পদ্ধতিগুলি অ্যাক্সেস করার মতো অফলাইন কোডগুলিতে অবৈধ হতে পারে, প্রতিফলনের ব্যবহার অপ্রত্যাশিত পার্শ্ব প্রতিক্রিয়া হতে পারে, যা কোডকে ত্রুটিযুক্ত করে এবং পোর্টেবিলিটি ধ্বংস করতে পারে। প্রতিফলিত কোড বিচ্ছিন্নতা বিরতি এবং অতএব প্ল্যাটফর্মের আপগ্রেড সঙ্গে আচরণ পরিবর্তন হতে পারে।

উত্স: প্রতিফলন API


প্রতিফলন একটি API যা রান পদ্ধতিতে পদ্ধতি, ক্লাস, ইন্টারফেসের আচরণ পরীক্ষা বা সংশোধন করতে ব্যবহৃত হয়।

  1. প্রতিফলনের জন্য প্রয়োজনীয় ক্লাস java.lang.reflect package অধীনে সরবরাহ করা হয়।
  2. প্রতিফলন আমাদের এমন শ্রেণী সম্পর্কে তথ্য দেয় যা কোনও বস্তুর অন্তর্গত এবং সেই ক্লাসের পদ্ধতি যা বস্তুটি ব্যবহার করে কার্যকর করা যেতে পারে।
  3. প্রতিফলনের মাধ্যমে আমরা তাদের সাথে ব্যবহৃত অ্যাক্সেস স্পেসিফায়ার নির্বিশেষে রানটাইম পদ্ধতিগুলি আহ্বান করতে পারি।

java.lang এবং java.lang.reflect প্যাকেজগুলি জাভা প্রতিফলনের জন্য ক্লাস সরবরাহ করে।

প্রতিফলন সম্পর্কে তথ্য পেতে ব্যবহার করা যেতে পারে -

  1. ক্লাসটি ক্লাসের নাম পাওয়ার জন্য getClass() পদ্ধতি ব্যবহার করা হয় যার একটি বস্তু রয়েছে।

  2. কনস্ট্রাক্টর getConstructors() পদ্ধতিটি ক্লাসের জন কন্সট্রাক্টরগুলির জন্য ব্যবহৃত হয় যা কোনও বস্তুর সাথে সম্পর্কিত।

  3. পদ্ধতিগুলি ক্লাসের পাবলিক পদ্ধতিগুলি পাওয়ার জন্য getMethods() পদ্ধতি ব্যবহার করা হয় যা কোন বস্তুর সাথে সম্পর্কিত।

প্রতিফলন API প্রধানত ব্যবহৃত হয়:

আইডিই (ইন্টিগ্রেটেড ডেভলপমেন্ট এনভায়রনমেন্ট) যেমন ইক্লিপস, মাইক্রিপ্স, নেটবিন ইত্যাদি।
ডিবাগার এবং টেস্ট টুল ইত্যাদি

প্রতিফলন ব্যবহার উপকারিতা:

এক্সটেনসিবিলিটি বৈশিষ্ট্য: একটি অ্যাপ্লিকেশন বহিরাগত, ব্যবহারকারী-সংজ্ঞায়িত ক্লাসগুলিকে তাদের পূর্ণ-যোগ্য নামগুলি ব্যবহার করে এক্সটেনসিবলি বস্তুর উদাহরণ তৈরি করে ব্যবহার করতে পারে।

ডিবাগিং এবং পরীক্ষার সরঞ্জাম: ডিবাগারগুলি ক্লাসে ব্যক্তিগত সদস্যদের পরীক্ষা করার প্রতিফলনের সম্পত্তি ব্যবহার করে।

অপূর্ণতা:

পারফরম্যান্স ওভারহেড: প্রতিফলিত ক্রিয়াকলাপগুলি তাদের অ-প্রতিক্রিয়াশীল সমতুল্যগুলির তুলনায় ধীর কর্মক্ষমতা রয়েছে, এবং কোডের বিভাগগুলিতে এড়িয়ে চলতে হবে যা কার্য সম্পাদন-সংবেদনশীল অ্যাপ্লিকেশনগুলিতে ঘন ঘন বলা হয়।

অভ্যন্তরীণ এক্সপোজার: প্রতিফলিত কোড বিচ্ছিন্নতা বিচ্ছেদ এবং অতএব প্ল্যাটফর্মের আপগ্রেডগুলির সাথে আচরণ পরিবর্তন করতে পারে।

রেফারেন্স: জাভা প্রতিফলন javarevisited.blogspot.in





terminology