প্রতিবিম্বের মাধ্যমে জাভাতে কোনও শ্রেণীর সার্বজনীন স্থিতিশীল চূড়ান্ত ক্ষেত্র / সম্পত্তিটির মূল্য অর্জন


103

বলুন আমার একটি ক্লাস আছে:

public class R {
    public static final int _1st = 0x334455;
}

প্রতিবিম্বের মাধ্যমে আমি কীভাবে "_1st" এর মান পেতে পারি ?


R._1stকাজ করতে পারি না? আপনি যদি অ্যান্ড্রয়েড বিকাশের কথা বলছেন তবে আমার মনে হয় Rক্লাসটি সবসময়ই থাকে ...
ম্যাথিউউ

@ ম্যাথিউ আমিও তাই ভেবেছিলাম, আজ অবধি যখন আমাকে এই একই জিনিসটি করতে হয়েছিল, তবে কেবল BRক্লাস দিয়ে।
সেবাদাস্তন সাবন্যুক

উত্তর:


132

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

Field f = R.class.getField("_1st");
Class<?> t = f.getType();
if(t == int.class){
    System.out.println(f.getInt(null));
}else if(t == double.class){
    System.out.println(f.getDouble(null));
}...

ধন্যবাদ। আমি চেষ্টা করেছি কিন্তু কাজ হয়নি। অপারেশন f.getInt (নাল) এ নিক্ষেপ করা হয়। আমি এটি ধরলাম তবে কীভাবে ব্যতিক্রম হবে?
ভিয়েতনাম

1
আপনি কি ধরনের ব্যতিক্রম পেয়েছেন?
এম। জেসুপ

হাই, ব্যতিক্রম e.getMessage () ফিল্ডের নাম দেয় যা "_1st" এবং অন্য কিছুই নয়।
ভিয়েতনাম

1
তবে ব্যতিক্রমটি কী? (অর্থাত নালপয়েন্টার এক্সসেপশন, সিকিউরিটি এক্সেপশন, ...)
এম জেসুপ

2
কীভাবে ডকুমেন্টেশনে কখনই উল্লেখ করা হয়নি যা getInt()যুক্তিতে পাসটিকে উপেক্ষা করে? ক্লাসের উদাহরণটি সেখানে যাওয়ার জন্য চেষ্টা করার জন্য কয়েক ঘন্টা ব্যয় করলেন।
সেবাদাস্তন সাবন্যুক

70
 R.class.getField("_1st").get(null);

ব্যতিক্রম হ্যান্ডলিং পাঠকের জন্য অনুশীলন হিসাবে বাকি আছে।

মূলত আপনি প্রতিবিম্বের মাধ্যমে ক্ষেত্রটি অন্যের মতো পান, তবে আপনি যখন গেট মেথডটি কল করেন তখন আপনি অকার্যকর হয়ে যাবেন কারণ কোনও কাজ করার নজির নেই।

এটি সমস্ত স্থিতিশীল ক্ষেত্রে চূড়ান্ত নির্বিশেষে কাজ করে। যদি ক্ষেত্রটি সর্বজনীন না setAccessible(true)হয় তবে আপনাকে প্রথমে এটি কল করতে হবে এবং অবশ্যই সিকিউরিটি ম্যানেজারকে এগুলির সমস্তটির অনুমতি দিতে হবে।


আমি বুঝতে পেরেছি. আমার যে ক্লাসের দরকার ছিল তা আসলে আর.আইডি ছিল was আপনার সাহায্যের জন্য ধন্যবাদ!
ভিয়েতনাম

1

আমি একই রুটটি অনুসরণ করছিলাম (উত্পন্ন আর ক্লাসটি দেখছিলাম) এবং তারপরে আমার এই ভয়ঙ্কর অনুভূতিটি হয়েছিল এটি সম্ভবত সম্পদ শ্রেণীর কোনও কাজ ছিল was আমি সঠিক ছিলাম.

এটি খুঁজে পেয়েছি: সংস্থানসমূহ: getIdentifier

ভেবেছিল এটি হয়ত কিছুটা সময় বাঁচায়। যদিও তারা ডক্সে এটি নিরুৎসাহিত বলেছে, এটি খুব অবাক হওয়ার মতো কিছু নয়।


সুতরাং আপনি অনুমান করেছিলেন এটি একটি অ্যান্ড্রয়েড প্রশ্ন ছিল। ট্যাগগুলিতে ইঙ্গিত করা উচিত ছিল ...
ম্যাথিউউ

এটি কোনও অ্যান্ড্রয়েড প্রশ্ন নয়, এটি একটি জাভা প্রতিবিম্ব প্রশ্ন যা একটি নির্দিষ্ট উদাহরণ ব্যবহার করে। প্রশ্নগুলি তাদের বিষয়ের উপর ভিত্তি করে ট্যাগ করা হয়।
ম্যাথু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.