जावा: एक वर्ग में सभी चर नाम मिलते हैं


91

मेरे पास एक वर्ग है और मैं इसके सभी सार्वजनिक क्षेत्रों (विधियों को नहीं) को खोजना चाहता हूं । मैं यह कैसे कर सकता हूँ?

धन्यवाद!


आपको रिफ्लेक्शन एपीआई का उपयोग करके ऐसा करने में सक्षम होना चाहिए ।
क्रोज़िन

जवाबों:


134
Field[] fields = YourClassName.class.getFields();

श्रेणी के सभी सार्वजनिक चर की एक सरणी देता है।

getFields()पूरे वर्ग-वारिस में खेतों को वापस करें। यदि आप फ़ील्ड को केवल विचाराधीन वर्ग में परिभाषित करना चाहते हैं, न कि उसके सुपरक्लासेस, उपयोग getDeclaredFields(), और publicनिम्नलिखित Modifierदृष्टिकोण वाले लोगों को फ़िल्टर करें :

Modifier.isPublic(field.getModifiers());

YourClassName.classशाब्दिक वास्तव में प्रकार का ऑब्जेक्ट का प्रतिनिधित्व करता है java.lang.Class। अधिक दिलचस्प प्रतिबिंब विधियों के लिए इसके डॉक्स देखें।

Fieldवर्ग से ऊपर है java.lang.reflect.Field। आप पूरे java.lang.reflectपैकेज पर एक नज़र डाल सकते हैं ।


2
सिर्फ एक नोट - शुरू में मेरे जवाब में एक गलत वक्तव्य था, फिर भी इसे कई बार उखाड़ा गया। कृपया अधिक ध्यान से पढ़ें;)
Bozho

1
@downvoter - गलती पहले थी। यदि आप अभी देखते हैं, तो कृपया साझा करें
बूझो

क्या यह समाधान धीमा है? या हम इसे स्वतंत्र रूप से उपयोग कर सकते हैं?
वाई

यह ठीक है। लेकिन इसका अधिक उपयोग न करें।
बूझो


15

आप अपनी आवश्यकता के आधार पर दोनों में से किसी का उपयोग कर सकते हैं:

Field[] fields = ClassName.class.getFields(); // returns inherited members but not private members.
Field[] fields = ClassName.class.getDeclaredFields(); // returns all members including private members but not inherited members.

उपरोक्त सूची से केवल सार्वजनिक क्षेत्रों को फ़िल्टर करने के लिए (आवश्यकता के आधार पर) कोड से नीचे का उपयोग करें:

List<Field> fieldList = Arrays.asList(fields).stream().filter(field -> Modifier.isPublic(field.getModifiers())).collect(
    Collectors.toList());

2

जैसा कि कुछ उपयोगकर्ताओं ने उल्लेख किया है, नीचे दिए गए कोड किसी दिए गए वर्ग के सभी क्षेत्रों को खोजने में मदद कर सकते हैं।

TestClass testObject= new TestClass().getClass();
Method[] methods = testObject.getMethods();
for (Method method:methods)
{
    String name=method.getName();
    if(name.startsWith("get"))
    {
        System.out.println(name.substring(3));
    }else if(name.startsWith("is"))
    {
        System.out.println(name.substring(2));
    }
}

हालांकि एक और दिलचस्प दृष्टिकोण नीचे है:

जैक्सन लाइब्रेरी की मदद से, मैं मानचित्र श्रेणी में स्ट्रिंग / पूर्णांक / डबल, और संबंधित मानों के सभी वर्ग गुणों को खोजने में सक्षम था। ( प्रतिबिंब का उपयोग किए बिना एपी! )

TestClass testObject = new TestClass();
com.fasterxml.jackson.databind.ObjectMapper m = new com.fasterxml.jackson.databind.ObjectMapper();

Map<String,Object> props = m.convertValue(testObject, Map.class);

for(Map.Entry<String, Object> entry : props.entrySet()){
    if(entry.getValue() instanceof String || entry.getValue() instanceof Integer || entry.getValue() instanceof Double){
        System.out.println(entry.getKey() + "-->" + entry.getValue());
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.