2011-08-24 5 views
8

Trong cuốn sách "Thinking in Java", có một ví dụ về cách lấy thông tin cho một bean thông qua Reflection/Introspection.Làm thế nào loại tài sản bean có thể là null?

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

Trong dòng 4 của mẫu trên có kiểm tra xem loại thuộc tính có rỗng không. Khi nào và dưới hoàn cảnh nào thì điều đó xảy ra? Bạn có thể đưa ra một ví dụ không?

Trả lời

2

Các Javadoc cho phương pháp getPropertyType của các trạng thái lớp PropertyDescriptor:

Kết quả có thể là "vô giá trị" nếu đây là một tài sản được lập chỉ mục mà không hỗ trợ truy cập không được lập chỉ mục.

Thuộc tính được lập chỉ mục là những thuộc tính được hỗ trợ bởi một mảng giá trị. Ngoài các phương thức truy cập chuẩn JavaBean, các thuộc tính được lập chỉ mục cũng có thể có các phương thức để lấy/thiết lập các phần tử riêng lẻ trong mảng, bằng cách chỉ định một chỉ mục. Các JavaBean, có thể vì thế, có thu khí được lập chỉ mục và setters:

public PropertyElement getPropertyName(int index) 
public void setPropertyName(int index, PropertyElement element) 

ngoài các getter tiêu chuẩn và setter để truy cập không được lập chỉ mục:

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

Going by the Mô tả Javadoc, nếu bạn bỏ qua người truy cập không được lập chỉ mục, bạn có thể nhận được giá trị trả lại là null cho loại thuộc tính của bộ mô tả thuộc tính.

Vì vậy, nếu bạn có một JavaBean của sự đa dạng sau đây, bạn có thể nhận được một giá trị trả về null:

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; 
    } 

} 

Note, trong khi đó bạn có thể thực hiện các accessors tài sản được lập chỉ mục một mình, nó không được khuyến khích để làm vì vậy, khi các trình truy cập chuẩn được sử dụng để đọc và ghi các giá trị, nếu bạn tình cờ sử dụng các phương thức getReadMethodgetWriteMethod của PropertyDescriptor.

3

Từ JavaDoc:

Returns null nếu loại là một tài sản được lập chỉ mục mà không hỗ trợ truy cập không được lập chỉ mục.

Vì vậy, tôi đoán nếu loại thuộc tính là thuộc tính được lập chỉ mục (như mảng), nó sẽ trả lại null.

2

Trả về giá trị này khi bạn có phương thức như int getValue(int index).

Các bản in mã sau

double is null 
ints class [I 

Lớp:

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; 
    } 
}