2016-09-21 8 views
6

मैं एक रूप है जो केवल String चर स्वीकार कर रहा है, लेकिन मैं एक Class उदाहरण उत्पन्न करने के लिए कि इस तरह के प्रत्येक स्ट्रिंग संपत्ति उसके संगत प्रकार में बदल जाती है चाहता हूँ वर्ग में संपत्ति के नाम से पहचाना गया।प्रपत्र स्ट्रिंग इनपुट का स्वत: रूपांतरण अन्य जावा प्रकार मान गतिशील रूप से एक वर्ग उदाहरण उत्पन्न करने के लिए

उदा। अगर मेरे पास NAME, ANNUAL SALARY और isLocalResident के नाम से तीन फ़ील्ड हैं। मैं इस फॉर्म को Class1 के उदाहरण में कनवर्ट करना चाहता हूं, जहां ये गुण String, BigInteger और Boolean प्रकार हैं।

मैं यह कैसे कर सकता हूं?

वर्तमान में मैं BeanUtil जावा की संपत्ति का उपयोग कर रहा हूं, लेकिन यह मेरी आवश्यकता को पूरा नहीं करता है क्योंकि यह केवल इसके आवश्यक प्रकारों में गुप्त नहीं होता है; बल्कि यह मुझे वांछित प्रकार के एक सेटटर और गेटर पूछता है। कृपया मुझे इससे बाहर निकलने में मदद करें। किसी भी सुझाव का स्वागत है?

पी ध्यान दें कि यह फ़ॉर्म गतिशील है, यानी संख्या और फ़ील्ड का नाम किसी अन्य इनपुट पर निर्भर करेगा। निम्न कोड emp1Employee1 कक्षा के लिए उदाहरण उत्पन्न करने का प्रतिनिधित्व करता है।

public Empolyee1 setContent(List<String> nameList, List<String> valueList) { 
    Empolyee1 emp1 = new Empolyee1(); 

    for(String attr : nameList) { 
     if(attr.equalsIgnoreCase("name")) { 
      if(valueList.get(nameList.indexOf("name")) != null && !valueList.get(nameList.indexOf("name")).trim().equals("")) { 
       emp1.setName(valueList.get(nameList.indexOf("name"))); 
      } 
    } else { 
     if(attr.equalsIgnoreCase("ANNUAL SALARY")) { 
      if(valueList.get(nameList.indexOf("ANNUAL SALARY")) != null && !valueList.get(nameList.indexOf("ANNUAL SALARY")).trim().equals("")) { 
        emp1.setAnnualSalary(valueList.get(nameList.indexOf("ANNUAL SALARY"))); 
      } 
     } else { 
      if(attr.equalsIgnoreCase("isLocalResident")) { 
       if(valueList.get(nameList.indexOf("isLocalResident")) != null && !valueList.get(nameList.indexOf("isLocalResident")).trim().equals("")) { 
        emp1.setIsLocalResident(valueList.get(nameList.indexOf("isLocalResident")));  
       } 
      } 
     } 
    } 
    return empl1; 
} 
+0

यह स्पष्ट नहीं है: आप एक कक्षा को गतिशील संख्या (गतिशील प्रकार के) के साथ स्वचालित रूप से रूपांतरित करने के साथ उदाहरण देना चाहते हैं? आप गुणों की संख्या और प्रकार को नहीं जानते हैं, लेकिन क्या आप समग्र संख्या और गुणों के प्रकार को जानते हैं? क्या आप जानते हैं (उदाहरण के लिए) 50 संभावित विशेषताओं, कि फार्म में हर क्रमपरिवर्तन में गठबंधन कर सकते हैं? –

+0

इसे देखें। http://stackoverflow.com/questions/13868986/ गतिशील रूप से-create-an-object-in-java-from-a-class-name-and-set-class-fields-by-u – Vel

+0

@AndreaLigios, हाँ मुझे पता है कुल संख्या और गुणों का प्रकार। उदाहरण के लिए, मेरे पास 100 विशेषताओं की कुल संख्या वाले 10 अलग-अलग वर्ग हैं। और प्रत्येक वर्ग में अलग-अलग गुण हो सकते हैं। और मेरे पास गेटटर और सेटर युक्त 10 कक्षाओं में से प्रत्येक के लिए xsd है। अब, मुझे यूआई से चयनित कक्षा सेट करनी है। –

उत्तर

0

मुख्य बिंदु फ़ील्ड नाम को जावा बीन संपत्ति नाम में परिवर्तित कर रहा है। toPropertyName विधि आपके प्रश्न के उदाहरण के आधार पर एक सरल कार्यान्वयन है।

public static String toPropertyName(String s) { 
    int len = s.length(); 
    StringBuilder sb = new StringBuilder(len); 
    boolean toUpper = false; 
    boolean isLower = false; 
    for (int i = 0; i < len; i++) { 
     char ch = s.charAt(i); 
     if (Character.isLetterOrDigit(ch)) { 
      if (Character.isUpperCase(ch)) { 
       sb.append((toUpper || isLower)?ch:Character.toLowerCase(ch)); 
       isLower = false; 
      } else { 
       isLower = true; 
       sb.append(toUpper?Character.toUpperCase(ch):ch); 
      } 
      toUpper = false; 
     } else { 
      isLower = false; 
      toUpper = true; 
     } 
    } 
    return sb.toString(); 
} 

public Empolyee1 setContent(List<String> nameList, List<String> valueList) throws Exception { 
    HashMap<String, String> map = new HashMap<String, String>(); 
    Iterator<String> nameIter = nameList.iterator(); 
    Iterator<String> valueIter = valueList.iterator(); 
    while (nameIter.hasNext()) { 
     String name = (String) nameIter.next(); 
     map.put(toPropertyName(name), valueIter.hasNext()?valueIter.next():null); 
    } 
    Empolyee1 emp1= new Empolyee1(); 
    BeanUtils.populate(emp1, map); 
    return emp1; 
} 

BeanUtils.populate(emp1, map) एपीआई अन्य नौकरी लेने के लिए प्रयोग किया जाता है (Bewared! यदि आप नेस्टेड सेम संपत्ति का समर्थन करने की जरूरत है, सुनिश्चित करें कि आपके कोड CVE-2014-0114 के संभावित वर्ग लोडर जोखिम को रोकने के कर ...)। यह प्रत्येक जावा बीन संपत्ति के इनपुट मूल्यों और कॉल सेटर को परिवर्तित करता है।

संबंधित मुद्दे