2012-10-21 20 views
5

Tôi có một đối tượng có chứa các thuộc tính phụ, cũng có các thuộc tính con và cứ như vậy.Lấy giá trị của một trường, với đường dẫn phân cấp

Tôi về cơ bản cần tìm cách tốt nhất để truy lục giá trị của một trường cụ thể trên đối tượng, với đường dẫn phân cấp đầy đủ như một chuỗi. Ví dụ, nếu đối tượng có công ty trường (Object) có trình khách trường (Object) có id trường (String), đường dẫn này sẽ được biểu diễn là company.client.id. Vì vậy, cho một con đường đến lĩnh vực này tôi đang cố gắng để có được giá trị của một đối tượng, làm thế nào tôi sẽ đi về việc này?

Chúc mừng.

+0

Bạn có biết lớp học? – alestanis

+0

Bạn có thể sử dụng phản chiếu. –

+0

Bạn có thể cần sử dụng lớp ['Field'] (http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Field.html) trong' Reflection API'. –

Trả lời

2

Vui lòng tìm bên dưới Fieldhelper lớp học với phương thức getFieldValue. Nó sẽ cho phép bạn giải quyết vấn đề của mình một cách nhanh chóng bằng cách tách chuỗi của bạn và sau đó áp dụng đệ quy getFieldValue đệ quy, lấy đối tượng kết quả làm đầu vào cho bước tiếp theo.

package com.bitplan.resthelper; 
import java.lang.reflect.Field; 

/** 
* Reflection help 
* @author wf 
* 
*/ 
public class FieldHelper { 

    /** 
    * get a Field including superclasses 
    * 
    * @param c 
    * @param fieldName 
    * @return 
    */ 
    public Field getField(Class<?> c, String fieldName) { 
     Field result = null; 
     try { 
      result = c.getDeclaredField(fieldName); 
     } catch (NoSuchFieldException nsfe) { 
      Class<?> sc = c.getSuperclass(); 
      result = getField(sc, fieldName); 
     } 
     return result; 
    } 

    /** 
    * set a field Value by name 
    * 
    * @param fieldName 
    * @param Value 
    * @throws Exception 
    */ 
    public void setFieldValue(Object target,String fieldName, Object value) throws Exception { 
     Class<? extends Object> c = target.getClass(); 
     Field field = getField(c, fieldName); 
     field.setAccessible(true); 
     // beware of ... 
     // http://docs.oracle.com/javase/tutorial/reflect/member/fieldTrouble.html 
     field.set(this, value); 
    } 

    /** 
    * get a field Value by name 
    * 
    * @param fieldName 
    * @return 
    * @throws Exception 
    */ 
    public Object getFieldValue(Object target,String fieldName) throws Exception { 
     Class<? extends Object> c = target.getClass(); 
     Field field = getField(c, fieldName); 
     field.setAccessible(true); 
     Object result = field.get(target); 
     return result; 
    } 

} 
+0

Ah điều này sẽ làm các trick! Chúc mừng –

+0

Có vẻ như một nỗ lực khác để đăng URL lên trang web bitplan của bạn. Ngoài ra, nỗ lực của bạn để bao gồm một giấy phép là trái với giấy phép bạn đồng ý khi bạn đăng nội dung ở đây ở nơi đầu tiên. Tôi đang chỉnh sửa văn bản/liên kết giấy phép của bạn. ** Không thêm lại chúng vào ** hoặc tôi sẽ gắn cờ là spam. –

+0

Andrew không rõ ràng rằng việc diễn giải Câu hỏi thường gặp về giấy phép là cho phép loại bỏ các tham chiếu trực tiếp tới tác giả. Đây sẽ là một trở ngại cho tôi để chia sẻ thêm mã nguồn ở đây. Nó là tốt để biết điều này! –

1

Trước tiên, bạn cần tách chuỗi của mình để nhận riêng lẻ fieldNames. Sau đó, cho mỗi tên trường, nhận thông tin được yêu cầu. Bạn sẽ phải lặp qua mảng fieldNames của mình.

Bạn có thể thử mã bên dưới. Tôi đã không được sử dụng Recursion Mặc dù vậy, nhưng nó sẽ làm việc: -

public static void main(String[] args) throws Exception { 

    String str = "company.client.id"; 
    String[] fieldNames = str.split("\\."); 

    Field field; 

    // Demo I have taken as first class that contains `company` 
    Class<?> targetClass = Demo.class; 
    Object obj = new Demo(); 

    for (String fieldName: fieldNames) { 

     field = getFieldByName(targetClass, fieldName);  
     targetClass = field.getType(); 

     obj = getFieldValue(obj, field);    
     System.out.println(field + " : " + obj); 

    } 

} 

public static Object getFieldValue(Object obj, Field field) throws Exception { 
    field.setAccessible(true); 
    return field.get(obj); 
} 

public static Field getFieldByName(Class<?> targetClass, String fieldName) 
                 throws Exception { 
    return targetClass.getDeclaredField(fieldName); 
} 
4

Bạn có thể sử dụng Apache Commons BeanUtilsPropertyUtilsBean.

Ví dụ về sử dụng:

PropertyUtilsBean pub = new PropertyUtilsBean(); 
Object property = pub.getProperty(yourObject, "company.client.id"); 
Các vấn đề liên quan