2012-05-26 31 views
5

Tôi có một bean, có cách nào để liệt kê tất cả các thuộc tính của bean mà không có danh sách từng cái một không?Làm thế nào để liệt kê các thuộc tính của bean

Một số loại đậu vượt quá phương thức ToString() hữu ích. Howvere đậu mà không ghi đè lên phương pháp này?

+0

toString() là một phương pháp. Không phải là một tài sản đậu. chính xác là bạn muốn làm gì? Bạn đã duyệt javadoc java.lang.Class chưa? –

+0

Nếu đây là bên trong Eclipse và bạn hài lòng với mã được tạo ra, thì hãy xem xét chỉ để cho Eclipse tự tạo ra nó. Tìm trong menu chuột phải-> nguồn. –

Trả lời

2

Bạn có thể sử dụng phản chiếu. Hãy lĩnh vực tuyên bố từ lớp, nó họ là kiểm tra tư nhân nếu họ có setters và thu khí (nhớ getter boolean là "isProperty")

Mã có thể trông như thế này:

List<String> properties = new ArrayList<String>(); 
Class<?> cl = MyBean.class; 

// check all declared fields 
for (Field field : cl.getDeclaredFields()) { 

    // if field is private then look for setters/getters 
    if (Modifier.isPrivate(field.getModifiers())) { 

     // changing 1st letter to upper case 
     String name = field.getName(); 
     String upperCaseName = name.substring(0, 1).toUpperCase() 
       + name.substring(1); 
     // and have getter and setter 
     try { 
      String simpleType = field.getType().getSimpleName(); 
      //for boolean property methods should be isProperty and setProperty(propertyType) 
      if (simpleType.equals("Boolean") || simpleType.equals("boolean")) { 
       if ((cl.getDeclaredMethod("is" + upperCaseName) != null) 
         && (cl.getDeclaredMethod("set" + upperCaseName, 
           field.getType()) != null)) { 
        properties.add(name); 
       } 
      } 
      //for not boolean property methods should be getProperty and setProperty(propertyType) 
      else { 
       if ((cl.getDeclaredMethod("get" + upperCaseName) != null) 
         && (cl.getDeclaredMethod("set" + upperCaseName, 
           field.getType()) != null)) { 
        properties.add(name); 
       } 
      } 
     } catch (NoSuchMethodException | SecurityException e) { 
      // if there is no method nothing bad will happen 
     } 
    } 
} 
for (String property:properties) 
    System.out.println(property); 
+1

Có vẻ như rất nhiều mã. Bất kỳ cách nào để đơn giản hóa quá trình này? –

+1

Có vài lớp trong gói 'java.bean' có thể đơn giản hóa nó, nhưng tôi không chắc chắn nếu bạn muốn sử dụng chúng. Ví dụ bạn tìm thuộc tính nào trong chiều cao 'class Person {private int height; public getHeight() {..} public setHeight (int h) {..} boolean isTall() {return height> 180;}} '? Nếu chúng ta sử dụng cách tiếp cận của mình, bạn sẽ chỉ nhận được 'height', nhưng nếu bạn sử dụng các lớp helper này, bạn sẽ nhận được' height' 'tall' nhưng cũng' class' vì mọi lớp đều có phương thức 'getClass()'. – Pshemo

+0

Cảm ơn, tôi quan tâm đến việc phân tích tất cả các thuộc tính của Bean sau khi deserialization từ GSON. Điều này là dành cho ứng dụng Android của tôi. –

4

Bạn có thể sử dụng BeanInfo qua BeanIntrospection như sau:

Object o = new MyBean(); 
try { 
    BeanInfo bi = Introspector.getBeanInfo(MyBean.class); 
    PropertyDescriptor[] pds = bi.getPropertyDescriptors(); 
    for (int i=0; i<pds.length; i++) { 
     // Get property name 
     String propName = pds[i].getName(); 

     // Get the value of prop1 
     Expression expr = new Expression(o, "getProp1", new Object[0]); 
     expr.execute(); 
     String s = (String)expr.getValue(); 
    } 
    // class, prop1, prop2, PROP3 
} catch (java.beans.IntrospectionException e) { 
} 

Hoặc bạn có thể đi với phương pháp phản xạ bằng một trong những phương pháp sau đây:

  1. Nhận tất cả không có tham số getXXX() phương pháp thông qua getDeclaredMethods và duyệt qua chúng
  2. Nhận tất cả các trường bằng cách sử dụng getDeclaredFields() và duyệt qua chúng (Không tuân thủ thông số Bean, nếu bạn quan tâm)
0

Bạn có thể quan tâm BeanInfo, một lớp có thể đi cùng một lớp đậu, mà không có các lớp bean cần phải được thay đổi. Nó được sử dụng trong nhiều trình xây dựng GUI để hiển thị các thuộc tính của một bean, nhưng cũng không sử dụng GUI.

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