2012-10-21 17 views
5

दिए गए किसी फ़ील्ड का मान प्राप्त करें मेरे पास एक ऑब्जेक्ट है जिसमें उप गुण हैं, जिनमें उप-गुण भी हैं।पदानुक्रमित पथ

मुझे मूल रूप से ऑब्जेक्ट पर किसी विशेष फ़ील्ड के मान को पुनर्प्राप्त करने का सबसे अच्छा तरीका खोजने की आवश्यकता है, इसे स्ट्रिंग के रूप में पूर्ण श्रेणीबद्ध पथ दिया गया है।

उदाहरण के लिए, यदि ऑब्जेक्ट में फील्ड कंपनी (ऑब्जेक्ट) है जिसमें फ़ील्ड क्लाइंट (ऑब्जेक्ट) है जिसमें फील्ड आईडी (स्ट्रिंग) है, तो यह पथ company.client.id के रूप में प्रदर्शित किया जाएगा। इसलिए, मैदान के लिए रास्ता दिया गया है, मैं किसी ऑब्जेक्ट पर मूल्य प्राप्त करने का प्रयास कर रहा हूं, मैं यह करने के बारे में कैसे जाऊं?

चीयर्स।

+0

आप कक्षाओं में पता है? – alestanis

+0

आप प्रतिबिंब का उपयोग कर सकते हैं। –

+0

आपको 'प्रतिबिंब एपीआई' में ['फ़ील्ड'] (http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Field.html) कक्षा का उपयोग करने की आवश्यकता हो सकती है। –

उत्तर

2

getFieldValue विधि के साथ Fieldhelper कक्षा से नीचे पाएं। यह आपको अपनी समस्या को द्वारा अपनी स्ट्रिंग को विभाजित करने और फिर getFieldValue को दोबारा लागू करने की अनुमति देनी चाहिए, परिणामस्वरूप ऑब्जेक्ट को अगले चरण के लिए इनपुट के रूप में लेना चाहिए।

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

आह यह चाल करेगा! चीयर्स –

+0

आपकी बिटप्लान वेबसाइट पर यूआरएल पोस्ट करने के लिए एक और प्रयास की तरह दिखता है। साथ ही, लाइसेंस शामिल करने का आपका प्रयास उस लाइसेंस के विपरीत है जब आप सामग्री को पहली जगह यहां पोस्ट करते हैं। मैं आपका लाइसेंस टेक्स्ट/लिंक संपादित कर रहा हूं। ** उन्हें ** में वापस न जोड़ें, या मैं स्पैम के रूप में ध्वजांकित करूंगा। –

+0

एंड्रयू यह मुझे स्पष्ट नहीं था कि लाइसेंस की एफएक्यू व्याख्या लेखक के प्रत्यक्ष संदर्भों को हटाने की अनुमति है। यहां मेरे लिए अधिक स्रोत कोड साझा करने में बाधा होगी। यह जानना अच्छा है! –

1

आप की जरूरत पहले व्यक्ति fieldNames पाने के लिए अपने स्ट्रिंग विभाजित करने के लिए। फिर प्रत्येक फ़ील्ड नाम के लिए, आवश्यक जानकारी प्राप्त करें। आपको फ़ील्ड नामों की अपनी सरणी पर फिर से चलना होगा।

आप नीचे दिए गए कोड को आजमा सकते हैं। मैं Recursion का इस्तेमाल किया है नहीं है, हालांकि, लेकिन यह काम करेगा: -

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

आप Apache Commons BeanUtilsPropertyUtilsBean उपयोग कर सकते हैं।

उपयोग का उदाहरण:

PropertyUtilsBean pub = new PropertyUtilsBean(); 
Object property = pub.getProperty(yourObject, "company.client.id"); 
संबंधित मुद्दे