मेरे पास एक वर्ग है और मैं इसके सभी सार्वजनिक क्षेत्रों (विधियों को नहीं) को खोजना चाहता हूं । मैं यह कैसे कर सकता हूँ?
धन्यवाद!
जवाबों:
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
पैकेज पर एक नज़र डाल सकते हैं ।
https://docs.oracle.com/javase/tutorial/reflect/class/classMembers.html में तरीकों और कंस्ट्रक्टर्स का पता लगाने के लिए चार्ट भी हैं।
आप अपनी आवश्यकता के आधार पर दोनों में से किसी का उपयोग कर सकते हैं:
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());
जैसा कि कुछ उपयोगकर्ताओं ने उल्लेख किया है, नीचे दिए गए कोड किसी दिए गए वर्ग के सभी क्षेत्रों को खोजने में मदद कर सकते हैं।
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());
}
}