2010-06-07 24 views

Trả lời

91

Bạn có thể sử dụng Class#getDeclaredFields() để nhận tất cả các trường được khai báo của lớp học. Bạn có thể sử dụng Field#get() để nhận giá trị.

Nói tóm lại:

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

Để tìm hiểu thêm về phản ánh, kiểm tra Sun tutorial on the subject.


Điều đó nói rằng, các lĩnh vực không nhất thiết tất cả đại diện cho thuộc tính của một VO. Bạn muốn xác định các phương thức công khai bắt đầu bằng get hoặc is và sau đó gọi phương thức đó để lấy các giá trị bất động sản thực thực.

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

Đó lần lượt nói, có thể có những cách thanh lịch hơn để giải quyết vấn đề thực tế của bạn. Nếu bạn xây dựng thêm một chút về yêu cầu chức năng mà bạn cho rằng đây là giải pháp đúng, thì chúng tôi có thể đề xuất giải pháp phù hợp. Có rất nhiều, nhiều công cụ có sẵn cho các sản phẩm massage javabeans.

+0

gì nếu tôi phải sửa đổi giá trị của trường i n đối tượng? Sửa đổi như giá trị hiện tại gte thực hiện một cái gì đó và sau đó thêm nó trở lại đối tượng? –

1

Tôi có một đối tượng (về cơ bản là VO) trong Java và tôi không biết loại của nó. Tôi cần phải nhận được các giá trị mà không phải là null trong đối tượng đó.

Có lẽ bạn không cần thiết cần phản ánh cho rằng - đây là một thiết kế đơn giản OO rằng có thể giải quyết vấn đề của bạn:

  1. Thêm một giao diện Validation đó phơi bày một phương pháp validate mà kiểm tra lĩnh vực và trả lại bất cứ điều gì là thích hợp.
  2. Triển khai giao diện và phương thức cho tất cả VO.
  3. Khi bạn nhận được VO, ngay cả khi đó là loại bê tông không xác định, bạn có thể nhập nó vào Validation và kiểm tra dễ dàng.

Tôi đoán rằng bạn cần trường rỗng để hiển thị thông báo lỗi theo cách tổng quát, vì vậy điều đó là đủ. Hãy cho tôi biết nếu điều này không làm việc cho bạn vì một lý do nào đó.

10

Đây là phương pháp nhanh chóng và dơ bẩn để thực hiện những gì bạn muốn theo cách chung chung. Bạn sẽ cần phải thêm xử lý ngoại lệ và có thể bạn sẽ muốn lưu các kiểu BeanInfo trong một 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; 
} 

Xem các tài liệu tham khảo:

Các vấn đề liên quan