2012-07-02 17 views
6

क्या कोई तरीका है जिसमें मैं स्वचालित रूप से कस्टम क्लास ऑब्जेक्ट को मानव पठनीय स्ट्रिंग में परिवर्तित कर सकता हूं?क्लास ऑब्जेक्ट को मानव पठनीय स्ट्रिंग में कनवर्ट करें

उदा। निम्नलिखित वर्ग पर विचार करें:

Person: Name="Tony", Salary=1000 
+0

अपने सभी क्षेत्रों को मुद्रित करने के लिए एक प्रतिबिंब उपयोगिता लिखें? –

+0

हाँ, यही वह है जिसे मैं ढूंढ रहा हूं।लेकिन प्रतिबिंब का उपयोग करने से यह काफी सामान्य हो जाएगा, मैं सोच रहा था कि कोई पहले से कहीं उपलब्ध है या नहीं! – MBZ

उत्तर

7

आयात कर रहा है Commons Lang आप इस्तेमाल कर सकते हैं ToStringBuilder

चेक विधि reflectionToString(java.lang.Object), यह स्वचालित रूप से प्रतिनिधित्व आप उम्मीद कर रहे हैं पैदा करेगा।

इस कोड:

Person p = new Person(); 
p.setName("Tony"); 
p.setSalary(1000); 

System.out.println(ToStringBuilder.reflectionToString(p)); 

परिणाम इस स्ट्रिंग:

[email protected][Name=Tony,Salary=1000] 
2

सुनिश्चित करें कि आप वर्ग के toString विधि ओवरराइड कर सकते हैं:

class Person { 
    String Name; 
    int Salary; 
    ... 
} 

Person p = new Person(); 
p.setName("Tony"); 
p.setSalary(1000); 

मैं की तरह कुछ पाने के लिए की जरूरत है।

पालन

:

class Person { 
    String name; 
    int salary; 
    ... 
    @Override public String toString() { 
     return "Person: Name='" + name + "', Salary=" + salary; 
    } 
} 

अधिक जानकारी के https://blogs.oracle.com/CoreJavaTechTips/entry/writing_tostring_methods_tech_days

+1

आपका मतलब है 'p.toString(); '??? या बस प्रिंट करें 'पी' जावा स्वचालित रूप से इसे मुद्रित करने के लिए स्ट्रिंग पर आ जाएगा। –

+0

या फिर ऑब्जेक्ट को स्ट्रिंग के रूप में प्रिंट करेगा। –

+0

आप इसे सीधे ऑब्जेक्ट से भी कॉल कर सकते हैं बस पी ठीक भी होगा अगर आप स्पष्ट रूप से निर्दिष्ट करना चाहते हैं तो आप भी कर सकते हैं .. –

2

यह वही है toString के लिए है मूल रूप से है के लिए संदर्भ लें। लेकिन आपको यह स्वचालित रूप से करने की इच्छा है, तो आप कुछ सामान्य सेवा बना सकते हैं जो इसे कर सकती है। सभी फ़ील्ड को फिर से भरने के लिए प्रतिबिंब का उपयोग करें, और फिर प्रत्येक के नाम और मूल्य को मुद्रित करें। अपने मूल्यों को मुद्रित करने का सबसे आसान तरीका उनके toString का उपयोग करके होगा, लेकिन आप उन्हें कुछ मामलों पर रिक्त रूप से उस प्रिंटिंग सेवा में भी पास कर सकते हैं (आपको निश्चित रूप से रोक की स्थिति मिलनी होगी)।

उदाहरण के लिए, कुछ वर्ग PrintUtils पर है:

public static void printFields(Object o) { 
    System.out.print(o.getClass.getSimpleName() + ": "); 
    for (Field field : o.getClass().getDeclaredFields()) { 
     field.setAccessible(true);  // you also get non-public fields 
     System.out.print(field.getName() + " = " + field.get(o) + ", "); 
    } 
} 

आप निश्चित रूप से उत्पादन को फ़ॉर्मेट अपवाद आदि संभाल और संभवतः बेहतर करने के लिए, होगा। साथ ही, वर्तमान वर्ग में घोषित यह केवल प्रिंट फ़ील्ड। यदि आप विरासत पदानुक्रम में उच्च घोषित फ़ील्ड चाहते हैं, तो आपको थोड़ा और काम करना होगा। अंत में, नियमित रूप से toString होने से प्रतिबिंब का उपयोग करना बहुत धीमा है। यदि toString का उपयोग करना संभव है, तो यह बेहतर है।

+0

उसकी आवश्यकताओं के आधार पर, वह सिर्फ सार्वजनिक गेटर्स पर भरोसा कर सकता है। इससे तर्क को सरल बनाया जाएगा, केवल उसे 'getMethods' पर फिर से चलाने की आवश्यकता होगी। –

+0

@MarkoTopolnik, हाँ, यकीन है। मैं केवल संभावना का प्रदर्शन करता हूं, वास्तविक कार्यान्वयन विशिष्ट आवश्यकताओं से मेल खाना चाहिए। – eran

+0

कोई विवाद नहीं, बस एक जोड़ा :) –

0
class Person { 
    String Name; 
    int Salary; 
    ... 

    @Override 
    public String toString() { 
    return "Person: Name = " + Name + "," + 
      "Salary="+Salary; 
    } 
} 

Person p = new Person(); 
p.setName("Tony"); 
p.setSalary(1000); 
System.out.println(p.toString()); 
0

एक तरह से यह करने के लिए अपाचे कॉमन्स BeanUtils.describe पर भरोसा करने की है। यह बीन के गुणों के Map का उत्पादन करेगा, जो Map.toString के माध्यम से अच्छी तरह से एक स्ट्रिंग में परिवर्तित हो जाता है। यदि आप कुछ और कस्टम चाहते हैं, तो आपको प्रतिबिंब एपीआई में खोदने की आवश्यकता होगी।

1

मुझे लगता है कि आप का उपयोग कर सकते हैं जो commons-lang का हिस्सा है।

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