प्रतिबिंब के माध्यम से जावा में सार्वजनिक स्थिर अंतिम क्षेत्र / एक वर्ग की संपत्ति का मूल्य प्राप्त करना


103

कहो कि मेरे पास एक वर्ग है:

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

मैं प्रतिबिंब के माध्यम से "_1st" का मूल्य कैसे प्राप्त कर सकता हूं ?


R._1stकाम नहीं कर सका? अगर आप Android के विकास के बारे में बात कर रहे हैं, तो मुझे लगता है कि Rकक्षा हमेशा है ...
Matthieu

@ मैथ्यू मैं ऐसा बहुत सोचता था, इस दिन तक जब मुझे यही काम करना था, लेकिन केवल BRकक्षा के साथ ।
सेवस्तन सवणुक

जवाबों:


132

पहले वर्ग की फ़ील्ड प्रॉपर्टी पुनः प्राप्त करें, फिर आप मान प्राप्त कर सकते हैं। यदि आप उस प्रकार को जानते हैं, जिसमें आप किसी एक विधि को null के साथ उपयोग कर सकते हैं (केवल स्थिर फ़ील्ड के लिए, वास्तव में एक स्थिर फ़ील्ड के साथ, गेट मेथड के लिए दिया गया तर्क पूरी तरह से अनदेखा कर दिया जाता है)। अन्यथा आप 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 (null) पर फेंक दिया जाता है। मैंने इसे पकड़ लिया है लेकिन एक अपवाद कैसे आया?
वियतनाम

1
आपको किस तरह का अपवाद मिला?
एम। जेसप

नमस्ते, अपवाद e.getMessage () फ़ील्ड नाम लौटाता है, जो "_1st" है और कुछ नहीं।
वियतनामी

1
लेकिन अपवाद का प्रकार क्या है? (यानी NullPointerException, SecurityException, ...)
एम। जेसप

2
कैसे प्रलेखन कभी उल्लेख नहीं है कि getInt()तर्क में पारित अनदेखी की? वहां से गुजरने के लिए कक्षा का उदाहरण प्राप्त करने की कोशिश में घंटों बिताए।
सेवस्तन सवण्युक

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

अपवाद हैंडलिंग पाठक के लिए एक अभ्यास के रूप में छोड़ दिया जाता है।

मूल रूप से आप प्रतिबिंब के माध्यम से किसी अन्य की तरह क्षेत्र प्राप्त करते हैं, लेकिन जब आप विधि प्राप्त करते हैं तो आप एक अशक्त में गुजरते हैं क्योंकि कार्य करने के लिए कोई उदाहरण नहीं है।

यह सभी स्थिर क्षेत्रों के लिए काम करता है, चाहे उनका अंतिम रूप कुछ भी हो। यदि फ़ील्ड सार्वजनिक नहीं है, तो आपको setAccessible(true)पहले उस पर कॉल करने की आवश्यकता है , और निश्चित रूप से SecurityManager को इस सब की अनुमति देनी होगी।


मैं समझ गया। मुझे जिस वर्ग की आवश्यकता थी, वह वास्तव में R.id था। आपकी सहायताके लिए धन्यवाद!
वियतनाम

1

मैं उसी मार्ग का अनुसरण कर रहा था (उत्पन्न आर वर्ग को देखकर) और फिर मुझे यह भयानक एहसास हुआ कि यह शायद संसाधन वर्ग में एक समारोह था। मैं सही था।

यह मिला: संसाधन :: getIdentifier

सोचा कि यह लोगों को कुछ समय बचा सकता है। हालांकि वे कहते हैं कि यह डॉक्स में हतोत्साहित करता है, जो बहुत आश्चर्य की बात नहीं है।


तो आपने अनुमान लगाया कि यह एक Android प्रश्न था। टैग में संकेत दिया जाना चाहिए था ...
Matthieu

यह एक Android प्रश्न नहीं है, यह एक जावा प्रतिबिंब प्रश्न है जो एक विशेष उदाहरण का उपयोग करता है। प्रश्न उनके विषय के आधार पर टैग किए जाते हैं।
मैथ्यू पढ़ें
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.