दिलचस्प पोस्ट
jquery UI टैब्स के साथ स्थान बदलना आईओएस के लिए जीएलबी का निर्माण कैसे करें मिश्रित सामग्री को अनुमति देने के लिए क्रोम कैसे प्राप्त करें? एक सूची को जावा में एक सेट में परिवर्तित करने का सबसे आसान तरीका त्रुटि C2275: एक अभिव्यक्ति के रूप में इस प्रकार के अवैध उपयोग N3.js में डी 3 का उपयोग कैसे करें? सी ++ में एल उपसर्ग बिल्कुल क्या है? फोनगैप – एंड्रॉइड ऐप के लिए स्प्लैश स्क्रीन सी और सी ++ में अलग पॉइंटर्स अलग-अलग परिभाषित क्यों हैं? सड़क के पते के लिए देशांतर और अक्षांश कैसे प्राप्त करें (और कानूनी रूप से) PHP / अपाचे के लिए ऊपरी स्मृति सीमा केवल एक घड़ी चक्र में 32 बिट इनपुट के लिए वर्गमूल कैसे प्राप्त करें? JQuery के लोडिंग को स्थगित करने के लिए संभव है? यूनिकोड अजगर में स्ट्रिंग द्वारा क्यों घोषित करें? जब मुझे कभी इसकी ज़रूरत नहीं होती तब -libraryjars का उपयोग करना क्यों शुरू हो गया?

जावा में क्लास एट्रिब्यूट्स पर लूप कैसे करें?

मैं गतिशील रूप से जावा में कक्षा विशेषताओं पर कैसे लूप कर सकता हूँ

उदाहरण के लिए:

public class MyClass { private type1 att1; private type2 att2; ... public void function() { for(var in MyClass.Attributes) { System.out.println(var.class); } } } 

जावा में यह संभव है?

Solutions Collecting From Web of "जावा में क्लास एट्रिब्यूट्स पर लूप कैसे करें?"

आप जो भी पूछ रहे हैं, उसके लिए कोई भाषाई समर्थन नहीं है।

आप प्रतिबिंब का उपयोग करके रन-टाइम पर एक प्रकार के सदस्यों को प्रतिबिंबित कर सकते हैं (उदाहरण के लिए Class.getDeclaredFields() ), लेकिन आप जो करने की कोशिश कर रहे हैं उसके आधार पर, यह सर्वोत्तम समाधान नहीं हो सकता है

यह भी देखें

  • जावा ट्यूटोरियल: प्रतिबिंब एपीआई / उन्नत भाषा के विषय: प्रतिबिंब

संबंधित सवाल

  • प्रतिबिंब क्या है, और यह क्यों उपयोगी है?
  • जावा प्रतिबिंब: यह इतना बुरा क्यों है?
  • कैसे प्रतिबिंब कोड सुगंध नहीं हो सकता है?
  • एक जावा ऑब्जेक्ट के गुणों को डंप करना

उदाहरण

यह केवल एक उदाहरण है जो कि कुछ प्रतिबिंब को करने में सक्षम है।

 import java.lang.reflect.*; public class DumpFields { public static void main(String[] args) { inspect(String.class); } static <T> void inspect(Class<T> klazz) { Field[] fields = klazz.getDeclaredFields(); System.out.printf("%d fields:%n", fields.length); for (Field field : fields) { System.out.printf("%s %s %s%n", Modifier.toString(field.getModifiers()), field.getType().getSimpleName(), field.getName() ); } } } 

उपरोक्त स्निपेट class String सभी घोषित क्षेत्रों का निरीक्षण करने के लिए प्रतिबिंब का उपयोग करता है; यह निम्न उत्पादन का उत्पादन करता है:

 7 fields: private final char[] value private final int offset private final int count private int hash private static final long serialVersionUID private static final ObjectStreamField[] serialPersistentFields public static final Comparator CASE_INSENSITIVE_ORDER 

प्रभावी जावा 2 संस्करण, आइटम 53: प्रतिबिंब के लिए इंटरफेस को प्राथमिकता दें

ये पुस्तक के अंश हैं:

Class ऑब्जेक्ट को देखते हुए, आप Constructor , Method और Class Field प्रतिनिधित्व करने वाले Constructor , Method और Field इंस्टेंस प्राप्त कर सकते हैं। [वे] आपको अपने अंतर्निहित समकक्षों को परावर्तित रूप से हेरफेर करते हैं यह शक्ति, हालांकि, एक कीमत पर आता है:

  • आप संकलन-समय की जांच के सभी लाभ खो देते हैं।
  • प्रतिबिंबित करने योग्य पहुंच करने के लिए आवश्यक कोड अनाड़ी और वर्बोज़ है।
  • प्रदर्शन ग्रस्त है

एक नियम के रूप में, रनटाइम पर सामान्य अनुप्रयोगों में वस्तुओं को प्रतिबिंबित नहीं किया जाना चाहिए।

कुछ परिष्कृत अनुप्रयोग हैं जो प्रतिबिंब की आवश्यकता होती हैं उदाहरणों में [… उद्देश्य पर छोड़े गए …] यदि आपको कोई संदेह है कि क्या आपका ऐप्लिकेशन इन श्रेणियों में से एक में पड़ता है, तो शायद यह संभवतः नहीं है

खेतों में सीधे प्रवेश करना जावा में वास्तव में अच्छी शैली नहीं है। मैं अपने सेम के खेतों के लिए गेस्टेटर और सेटर पद्धतियां बनाने का सुझाव देता हूं और फिर java.beans पैकेज से उसके बाद इंट्रोस्पेक्टर और बीनइन्फो कक्षाओं का उपयोग कर रहा हूं।

 MyBean bean = new MyBean(); BeanInfo beanInfo = Introspector.getBeanInfo(MyBean.class); for (PropertyDescriptor propertyDesc : beanInfo.getPropertyDescriptors()) { String propertyName = propertyDesc.getName(); Object value = propertyDesc.getReadMethod().invoke(bean); } 

जब मैं जॉर्न के उत्तर से सहमत हूं, यदि आपका क्लास जावाबीएब्स स्पेक के अनुरूप है, तो यह एक अच्छा विकल्प है यदि यह नहीं है और आप स्प्रिंग का इस्तेमाल करते हैं।

स्प्रिंग में रिफ्लेब्यूउटल नाम की एक क्लास है जो डूथफिल्ड (क्लास, कॉलबैक) सहित कुछ बहुत ही शक्तिशाली कार्यक्षमता प्रदान करता है, विज़िटर-स्टाइल पद्धति है जो आपको एक कॉलबैक ऑब्जेक्ट का उपयोग करके इस तरह से क्लास फ़ील्ड पर पुनरावृति करने देता है:

 public void analyze(Object obj){ ReflectionUtils.doWithFields(obj.getClass(), field -> { System.out.println("Field name: " + field.getName()); field.setAccessible(true); System.out.println("Field value: "+ field.get(obj)); }); } 

लेकिन यहां एक चेतावनी दी गई है: वर्ग को "केवल आंतरिक उपयोग के लिए" के रूप में चिह्नित किया गया है, जो कि अगर आप मुझसे पूछें तो दया है

वर्ग के क्षेत्रों को पुनरावृत्त करने और वस्तु से मूल्य प्राप्त करने का आसान तरीका:

  Class<?> c = obj.getClass(); Field[] fields = c.getDeclaredFields(); Map<String, Object> temp = new HashMap<String, Object>(); for( Field field : fields ){ try { temp.put(field.getName().toString(), field.get(obj)); } catch (IllegalArgumentException e1) { } catch (IllegalAccessException e1) { } } 

जावा प्रतिबिंब (java.reflection। *) है, लेकिन मैं अपाचे बीनुटील्स जैसी एक पुस्तकालय में देखने का सुझाव दूंगा, यह प्रतिबिंब सीधे सीधा इस्तेमाल करने की तुलना में इस प्रक्रिया को बहुत कम बालों वाली बना देगा।

जावा प्रतिबिंबों का उपयोग करके आप गतिशील रूप से वर्ग विशेषताओं को पाशन कर सकते हैं API-

 for (Field field : objClass.getDeclaredFields()) { // Invoke the getter method on the Institution1 object. Object objField = new PropertyDescriptor(field.getName(), Institute1.class).getReadMethod().invoke(inst1); 

यहां एक समाधान है जो वर्णों के अनुसार गुणों को क्रमबद्ध करता है और उन सभी को उनके मूल्यों के साथ प्रिंट करता है:

 public void logProperties() throws IllegalArgumentException, IllegalAccessException { Class<?> aClass = this.getClass(); Field[] declaredFields = aClass.getDeclaredFields(); Map<String, String> logEntries = new HashMap<>(); for (Field field : declaredFields) { field.setAccessible(true); Object[] arguments = new Object[]{ field.getName(), field.getType().getSimpleName(), String.valueOf(field.get(this)) }; String template = "- Property: {0} (Type: {1}, Value: {2})"; String logMessage = System.getProperty("line.separator") + MessageFormat.format(template, arguments); logEntries.put(field.getName(), logMessage); } SortedSet<String> sortedLog = new TreeSet<>(logEntries.keySet()); StringBuilder sb = new StringBuilder("Class properties:"); Iterator<String> it = sortedLog.iterator(); while (it.hasNext()) { String key = it.next(); sb.append(logEntries.get(key)); } System.out.println(sb.toString()); }