2010-04-21 13 views
5

मेरे पास एक जावा क्लास है जिसमें डेटाबेस तालिका के सभी कॉलम विशेषताएँ (सदस्य चर) और संबंधित गेटर्स और सेटर्स हैं।जावा क्लास में विशेषताओं की संख्या कैसे प्राप्त करें?

मैं getColumnCount() नामक इस कक्षा में एक विधि चाहता हूं जो कॉलम की संख्या लौटाता है (यानी कक्षा में विशेषताओं की संख्या)? संख्या को हार्डकोड किए बिना मैं इसे कैसे कार्यान्वित करूं? मैं सामान्य और सुझावों पर आलोचकों के लिए खुला हूं। धन्यवाद।

+1

आप शायद प्रतिबिंब के साथ ऐसा कर सकते हैं, लेकिन आपको उस नंबर को जानने की आवश्यकता क्यों है? मुझे लगता है कि आप जो करने की कोशिश कर रहे हैं उसे करने का एक बेहतर तरीका हो सकता है। – Syntactic

उत्तर

18

reflection API देखें। प्रश्न में वर्ग वास्तव में एक शुद्ध JavaBean है, तो आप फ़ील्ड की संख्या इस प्रकार प्राप्त कर सकते हैं (गुण या स्तंभों के रूप में आप यह कहते हैं):

public int getColumnCount() { 
    return getClass().getDeclaredFields().length; 
} 

मैं हालांकि अत्यधिक इस के लिए की जरूरत सवाल उठाते हैं। यदि आप कार्यात्मक आवश्यकता के बारे में कुछ और बताते हैं जिसके लिए आपको लगता है कि आपको इस दृष्टिकोण/समाधान की आवश्यकता है, तो हम बेहतर तरीके सुझा सकते हैं।

+0

धन्यवाद, यह काम करता है। जहां तक ​​तर्क है, यह मुख्य रूप से लॉगिंग के लिए है: मुझे तालिका में कॉलम की संख्या जानने की आवश्यकता है ताकि अपडेट के दौरान फ़ील्ड में पुराने <-> नए डेटा का ट्रैक रखा जा सके। कॉलम गिनती जरूरी है ताकि लॉगिंग क्लासेस जान सकें कि लॉगजिन टेबल में कितनी पंक्तियां डाली जाएंगी। – llm

+2

यदि आप एक सभ्य ओआरएम एपीआई का उपयोग कर रहे हैं, तो आप मैपिंग विवरणों को समझने के लिए एपीआई-प्रदत्त विधियों का उपयोग कर सकते हैं। जेपीए और अच्छा ओल 'हाइबरनेट ऐसा कर सकता है। – BalusC

+0

हां। दुर्भाग्य से मैं जिस कोड के साथ काम कर रहा हूं वह ओआरएम एपीआई का उपयोग नहीं करता है। – llm

0

एक दृष्टिकोण कक्षा के तरीकों की सूची बनाने के लिए प्रतिबिंब का उपयोग करना होगा और उन तरीकों की गणना करना होगा जिनके नाम नियमित अभिव्यक्ति "^set.+$" से मेल खाते हैं।

0

"डेटाबेस कॉलम" जैसी एनोटेशन बनाएं, इसका उपयोग करें जो फ़ील्ड कॉलम में मानचित्र फ़ील्ड करता है। आप फ़ील्ड या गेटर विधियों के लिए एनोटेशन का उपयोग कर सकते हैं। इसलिए यह डेटाबेस तालिका में उपयोग नहीं किए जाने वाले क्षणिक फ़ील्ड के लिए सुरक्षित है।

// in this sample annotation used for getter methods 
public int getColumnCount() { 
    int count = 0; 
    Method[] methods = getClass().getDeclaredMethods(); 
    for (Method method : methods) { 
     if (method.isAnnotationPresent(DatabaseColumn.class)) { 
      count++; 
     } 
    } 
    return count; 
} 
संबंधित मुद्दे