क्या कोई तरीका है जिसमें मैं स्वचालित रूप से कस्टम क्लास ऑब्जेक्ट को मानव पठनीय स्ट्रिंग में परिवर्तित कर सकता हूं?क्लास ऑब्जेक्ट को मानव पठनीय स्ट्रिंग में कनवर्ट करें
उदा। निम्नलिखित वर्ग पर विचार करें:
Person: Name="Tony", Salary=1000
क्या कोई तरीका है जिसमें मैं स्वचालित रूप से कस्टम क्लास ऑब्जेक्ट को मानव पठनीय स्ट्रिंग में परिवर्तित कर सकता हूं?क्लास ऑब्जेक्ट को मानव पठनीय स्ट्रिंग में कनवर्ट करें
उदा। निम्नलिखित वर्ग पर विचार करें:
Person: Name="Tony", Salary=1000
आयात कर रहा है 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]
सुनिश्चित करें कि आप वर्ग के 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
आपका मतलब है 'p.toString(); '??? या बस प्रिंट करें 'पी' जावा स्वचालित रूप से इसे मुद्रित करने के लिए स्ट्रिंग पर आ जाएगा। –
या फिर ऑब्जेक्ट को स्ट्रिंग के रूप में प्रिंट करेगा। –
आप इसे सीधे ऑब्जेक्ट से भी कॉल कर सकते हैं बस पी ठीक भी होगा अगर आप स्पष्ट रूप से निर्दिष्ट करना चाहते हैं तो आप भी कर सकते हैं .. –
यह वही है 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
का उपयोग करना संभव है, तो यह बेहतर है।
उसकी आवश्यकताओं के आधार पर, वह सिर्फ सार्वजनिक गेटर्स पर भरोसा कर सकता है। इससे तर्क को सरल बनाया जाएगा, केवल उसे 'getMethods' पर फिर से चलाने की आवश्यकता होगी। –
@MarkoTopolnik, हाँ, यकीन है। मैं केवल संभावना का प्रदर्शन करता हूं, वास्तविक कार्यान्वयन विशिष्ट आवश्यकताओं से मेल खाना चाहिए। – eran
कोई विवाद नहीं, बस एक जोड़ा :) –
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());
एक तरह से यह करने के लिए अपाचे कॉमन्स BeanUtils.describe पर भरोसा करने की है। यह बीन के गुणों के Map
का उत्पादन करेगा, जो Map.toString
के माध्यम से अच्छी तरह से एक स्ट्रिंग में परिवर्तित हो जाता है। यदि आप कुछ और कस्टम चाहते हैं, तो आपको प्रतिबिंब एपीआई में खोदने की आवश्यकता होगी।
मुझे लगता है कि आप का उपयोग कर सकते हैं जो commons-lang
का हिस्सा है।
आप जावा से संदेश स्वरूप का उपयोग कर सकते हैं: द्वारा https://docs.oracle.com/javase/tutorial/i18n//message.html अलग चर - और वहाँ आप अपने वर्ग के एक humanreadable स्ट्रिंग है!
अपने सभी क्षेत्रों को मुद्रित करने के लिए एक प्रतिबिंब उपयोगिता लिखें? –
हाँ, यही वह है जिसे मैं ढूंढ रहा हूं।लेकिन प्रतिबिंब का उपयोग करने से यह काफी सामान्य हो जाएगा, मैं सोच रहा था कि कोई पहले से कहीं उपलब्ध है या नहीं! – MBZ