2011-08-24 8 views
8

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

BeanInfo bi = Introspector.getBeanInfo(Car.class, Object.class); 
for (PropertyDescriptor d: bi.getPropertyDescriptors()) { 
    Class<?> p = d.getPropertyType(); 
    if (p == null) continue; 
    [...] 
} 

ऊपर दिए गए नमूने की पंक्ति 4 में एक जांच है यदि संपत्ति प्रकार शून्य है। कब और किस परिस्थिति में ऐसा होता है? क्या आप एक उदाहरण दे सकते हैं?

उत्तर

2

PropertyDescriptor वर्ग राज्यों के getPropertyType विधि के लिए जावाडोक:

परिणाम "अशक्त" हो सकता है अगर यह एक अनुक्रमित संपत्ति है कि नहीं समर्थन गैर सूचीबद्ध पहुँच करता है।

इंडेक्स किए गए गुण वे हैं जो मानों की एक सरणी द्वारा समर्थित हैं। मानक जावाबीन एक्सेसर विधियों के अतिरिक्त, अनुक्रमित गुणों में इंडेक्स निर्दिष्ट करके सरणी में अलग-अलग तत्वों को प्राप्त/सेट करने के तरीके भी हो सकते हैं।

public PropertyElement getPropertyName(int index) 
public void setPropertyName(int index, PropertyElement element) 
अलावा

मानक गेटर और गैर सूचीबद्ध पहुँच के लिए सेटर:

public PropertyElement[] getPropertyName() 
public void setPropertyName(PropertyElement element[]) 

, जावाडोक वर्णन से जा रहे हैं अगर आप को छोड़ देते हैं JavaBean, इसलिए हो सकता है, अनुक्रमित getters और setters है गैर अनुक्रमित एक्सेसर्स, आप प्रॉपर्टी डिस्क्रिप्टर के प्रॉपर्टी प्रकार के लिए null का रिटर्न वैल्यू प्राप्त कर सकते हैं।

इसलिए, यदि आप निम्नलिखित विभिन्न प्रकार के एक JavaBean है, तो आप एक अशक्त वापसी प्राप्त कर सकते हैं:

class ExampleBean 
{ 

    ExampleBean() 
    { 
     this.elements = new String[10]; 
    } 

    private String[] elements; 

    // standard getters and setters for non-indexed access. Comment the lines in the double curly brackets, to have getPropertyType return null. 
    // {{ 
    public String[] getElements() 
    { 
     return elements; 
    } 

    public void setElements(String[] elements) 
    { 
     this.elements = elements; 
    } 
    // }} 

    // indexed getters and setters 
    public String getElements(int index) { 
     return this.elements[index]; 
    } 

    public void setElements(int index, String[] elements) 
    { 
     this.elements[index] = elements; 
    } 

} 

ध्यान दें, जबकि यह है कि आप अनुक्रमित संपत्ति accessors अकेले लागू कर सकते हैं, यह करने के लिए अनुशंसित नहीं है इसलिए, मानक एक्सेसर्स का उपयोग मूल्यों को पढ़ने और लिखने के लिए किया जाता है, यदि आप getReadMethod और getWriteMethodPropertyDescriptor के तरीकों का उपयोग करते हैं।

3

JavaDoc से: अगर प्रकार एक अनुक्रमित संपत्ति है कि गैर सूचीबद्ध पहुँच का समर्थन नहीं करता है

रिटर्न अशक्त।

तो मुझे लगता है कि संपत्ति प्रकार एक अनुक्रमित संपत्ति है (एक सरणी की तरह) यह null वापस आ जाएगा।

2

जब आपके पास int getValue(int index) जैसी कोई विधि है तो यह शून्य हो जाता है।

निम्नलिखित कोड प्रिंट

double is null 
ints class [I 

वर्ग:

import java.beans.BeanInfo; 
import java.beans.IntrospectionException; 
import java.beans.Introspector; 
import java.beans.PropertyDescriptor; 

public class BeanInfos { 

public static void main(String[] args) { 

    try { 
     BeanInfo bi = Introspector.getBeanInfo(ClassA.class, Object.class); 
     for (PropertyDescriptor d : bi.getPropertyDescriptors()) { 
     Class<?> p = d.getPropertyType(); 
     if (p == null) 
      System.out.println(d.getName() + " is null"); 
     else 
      System.out.println(d.getName() + " " + p); 
     } 
    } catch (IntrospectionException e) { 
     e.printStackTrace(); 
    } 
    } 

} 

class ClassA { 
    private int[] ints; 
    private double[] doubles; 

    public int[] getInts() { 
    return ints; 
    } 

    public void setInts(int[] ints) { 
    this.ints = ints; 
    } 

    public double getDouble(int idx) { 
    return doubles[idx]; 
    } 

    public void setDoubles(double val, int idx) { 
    this.doubles[idx] = val; 
    } 
}