2010-10-11 9 views

उत्तर

5

आप अपने सभी वर्गों में toString को ओवरराइड करके इसे फिर से प्रिंट कर सकते हैं।

यदि आप printObjectRecursively(Object o) जैसी कोई विधि चाहते हैं तो आपको प्रतिबिंब में गोता लगाने, फ़ील्ड लाने, printObjectRecursively(someField) का उपयोग करके अपना नाम और सामग्री दोबारा प्रिंट करने की आवश्यकता है।

उदाहरण:

public class Test { 
    public static void main(String[] args) { 
     A a = new A(); 
     System.out.println(a); 
    } 
} 

class A { 
    int i = 5; 
    B obj = new B(); 
    String str = "hello"; 
    public String toString() { 
     return String.format("A: [i: %d, obj: %s, str: %s]", i, obj, str); 
    } 
} 

class B { 
    int j = 17; 
    public String toString() { 
     return String.format("B: [j: %d]", j); 
    } 
} 

प्रिंटों:

A: [i: 5, obj: B: [j: 17], str: hello] 

एक प्रतिबिंब आधारित पुनरावर्ती प्रिंट विधि इस

private static final List LEAVES = Arrays.asList(
     Boolean.class, Character.class, Byte.class, Short.class, 
     Integer.class, Long.class, Float.class, Double.class, Void.class, 
     String.class); 

public static String toStringRecursive(Object o) throws Exception { 

    if (o == null) 
     return "null"; 

    if (LEAVES.contains(o.getClass())) 
     return o.toString(); 

    StringBuilder sb = new StringBuilder(); 
    sb.append(o.getClass().getSimpleName()).append(": ["); 
    for (Field f : o.getClass().getDeclaredFields()) { 
     if (Modifier.isStatic(f.getModifiers())) 
      continue; 
     f.setAccessible(true); 
     sb.append(f.getName()).append(": "); 
     sb.append(toStringRecursive(f.get(o))).append(" "); 
    } 
    sb.append("]"); 
    return sb.toString(); 
} 
+0

आपको बहुत धन्यवाद Aioobe – tom

+0

इस विधि ने मुझे एक स्टैकओवरफ्लो एरर दिया :) – KjetilNordin

+0

@KjetilNordin सही है, जब संभव हो तो रिकर्सन से बचा जाना चाहिए। डीज़ोन पर इसके बारे में एक अच्छा पठन: https://dzone.com/articles/folding-the-universe-part-ii-abstracting-recursion ("ब्रह्मांड को तब्दील करना" लेख)। – Benj

0

की तरह कुछ लिखा जा सकता है आप के लिए toString विधि को लागू करना चाहिए अपने कक्षाएं - यह कक्षा के सदस्यों के बारे में जानकारी प्रिंट करेगा - usuall वाई toString विधियों का उपयोग कर। | फिर आप संग्रह के माध्यम से पुन: प्रयास करते हैं और toString प्रत्येक आइटम

0

क्या आपको वाकई इन सूचनाओं को प्रिंट करने की आवश्यकता है? शायद डिबगिंग के दौरान देखना पर्याप्त होगा?

0

आप toString विधि ओवरराइड कर सकते हैं।

उदाहरण:

class foo 
{ 
int i,j; 

String toString() 
{ 
StringBuilder b=new StringBuilder(); 
return b.append(i).append(j).toString(); 
} 
} 
0

उपयोग Jackson (JSON) की तरह क्रमबद्धता पुस्तकालयों में से एक।

यह सब कुछ सादे पाठ में डंप करता है। यदि आप थोड़ी किस्मत के साथ सामग्री को सुंदर बनाने के लिए जावास्क्रिप्ट सक्षम संपादक का उपयोग करते हैं, तो आप वास्तव में इससे कुछ समझ सकते हैं।

वस्तुओं का एक बहुत serializable नहीं हैं, तो आप पठनीय निरर्थक शब्दों का एक बहुत जो कुछ भी मदद नहीं करेगा, दुर्भाग्य के साथ खत्म हो सकता है,

YMMV

0

मैं बड़ी सफलता इस पर क्या कर लिया है ऑब्जेक्ट्स के JSON प्रस्तुतियों को डंप करने के लिए XStream का उपयोग करके एक आकस्मिक आधार। यह वस्तुओं को दोहराता है और ऐसा लगता है कि आप इसे अधिकतर समय करना चाहते हैं। और यह सुपर हल्का है। उदाहरण:

private static final XStream jsonXStream = 
    new XStream(new JsonHierarchicalStreamDriver()); 

public static String toDebugString(Object object) { 
    return jsonXStream.toXML(object); 
    // ignore "toXML" name, it's going to be JSON. 
} 
0

आप

ToStringBuilder.reflectionToString (यह) का उपयोग कर सकते हैं;

अपाचे कॉमन लैंग में ToStringBuilder क्लास शामिल है। आप ToStringStyle ऑब्जेक्ट के साथ अलग-अलग शैली को परिभाषित कर सकते हैं।

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