2010-06-07 14 views
49

मेरे पास जावा में एक ऑब्जेक्ट (मूल रूप से एक वीओ) है और मुझे इसका प्रकार पता नहीं है।
मुझे उन मानों को प्राप्त करने की आवश्यकता है जो उस ऑब्जेक्ट में शून्य नहीं हैं।प्रतिबिंब के माध्यम से किसी ऑब्जेक्ट में फ़ील्ड्स कैसे प्राप्त करें?

यह कैसे किया जा सकता है?

उत्तर

91

आप कक्षा के सभी घोषित क्षेत्रों को प्राप्त करने के लिए Class#getDeclaredFields() का उपयोग कर सकते हैं। मूल्य प्राप्त करने के लिए आप Field#get() का उपयोग कर सकते हैं।

संक्षेप में:

Object someObject = getItSomehow(); 
for (Field field : someObject.getClass().getDeclaredFields()) { 
    field.setAccessible(true); // You might want to set modifier to public first. 
    Object value = field.get(someObject); 
    if (value != null) { 
     System.out.println(field.getName() + "=" + value); 
    } 
} 

प्रतिबिंब के बारे में अधिक जानने के लिए जाँच Sun tutorial on the subject


जिसके अनुसार, खेतों करता है जरूरी नहीं कि सभी एक VO के गुणों का प्रतिनिधित्व करते हैं। आप get या is से शुरू होने वाली सार्वजनिक विधियों को निर्धारित करना चाहते हैं और फिर वास्तविक संपत्ति मानों को पकड़ने के लिए इसे आमंत्रित करें।

for (Method method : someObject.getClass().getDeclaredMethods()) { 
    if (Modifier.isPublic(method.getModifiers()) 
     && method.getParameterTypes().length == 0 
     && method.getReturnType() != void.class 
     && (method.getName().startsWith("get") || method.getName().startsWith("is")) 
    ) { 
     Object value = method.invoke(someObject); 
     if (value != null) { 
      System.out.println(method.getName() + "=" + value); 
     } 
    } 
} 

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

+0

क्या होगा यदि मैं करने के लिए है क्षेत्र के मूल्य को संशोधित करें i एन वस्तु? संशोधित करें जैसे gte वर्तमान मान कुछ निष्पादित करते हैं और फिर इसे ऑब्जेक्ट में वापस जोड़ते हैं? –

1

मेरे पास जावा में एक ऑब्जेक्ट (मूल रूप से एक वीओ) है और मुझे इसका प्रकार पता नहीं है। मुझे उन मानों को प्राप्त करने की आवश्यकता है जो उस ऑब्जेक्ट में शून्य नहीं हैं।

  1. एक अंतरफलक Validation जो एक विधि validate जो की जाँच करता है बेनकाब करें: -

हो सकता है कि आपको लगता है कि के लिए आवश्यक जरूरत प्रतिबिंब नहीं है यहाँ एक सादा OO डिजाइन कि आपकी समस्या का समाधान हो सकता है खेतों और जो भी उचित है वापस लौटें।

  • इंटरफ़ेस और सभी वीओ के लिए विधि लागू करें।
  • जब आप वीओ प्राप्त करते हैं, भले ही यह ठोस प्रकार अज्ञात है, तो आप इसे Validation पर टाइप कर सकते हैं और आसानी से जांच सकते हैं।
  • मुझे लगता है कि आपको उस क्षेत्र की आवश्यकता है जो एक सामान्य तरीके से त्रुटि संदेश प्रदर्शित करने के लिए शून्य है, ताकि यह पर्याप्त हो। मुझे बताएं कि यह किसी कारण से आपके लिए काम नहीं करता है।

    10

    यहां एक त्वरित और गंदे विधि है जो आप सामान्य रूप से जो चाहते हैं वह करता है। आपको अपवाद हैंडलिंग जोड़ने की आवश्यकता होगी और आप शायद BeakhInfo प्रकारों को एक weakhashmap में कैश करना चाहते हैं।

    public Map<String, Object> getNonNullProperties(final Object thingy) { 
        final Map<String, Object> nonNullProperties = new TreeMap<String, Object>(); 
        try { 
         final BeanInfo beanInfo = Introspector.getBeanInfo(thingy 
           .getClass()); 
         for (final PropertyDescriptor descriptor : beanInfo 
           .getPropertyDescriptors()) { 
          try { 
           final Object propertyValue = descriptor.getReadMethod() 
             .invoke(thingy); 
           if (propertyValue != null) { 
            nonNullProperties.put(descriptor.getName(), 
              propertyValue); 
           } 
          } catch (final IllegalArgumentException e) { 
           // handle this please 
          } catch (final IllegalAccessException e) { 
           // and this also 
          } catch (final InvocationTargetException e) { 
           // and this, too 
          } 
         } 
        } catch (final IntrospectionException e) { 
         // do something sensible here 
        } 
        return nonNullProperties; 
    } 
    

    इन संदर्भों को देखें:

    संबंधित मुद्दे

     संबंधित मुद्दे