2011-10-10 13 views
8

मेरे ऐप के प्रयोजनों के लिए मुझे (उदाहरण नहीं) और रनटाइम में उन फ़ील्ड के प्रकारों की सूची खोजने में सक्षम होना चाहिए। अब तक मैं केवल classOf[MyCaseClass].getMethods के साथ गेटर्स वाले केस क्लास के तरीकों की एक सूची प्राप्त करने में सक्षम था और सरल वर्ग से कुछ भी उपयोगी नहीं था। क्या मैं कुछ भूल रहा हूँ? क्या उस तरह के उद्देश्यों के लिए कोई प्रतिबिंब पुस्तकालय हैं? यह सही तरीके से कैसे किया जाता है?स्कैला क्लास .getFields

+0

मैं उलझन में हूँ - शीर्षक क्षेत्रों कहते हैं, और फिर आप तरीकों की तलाश में जाना । तुम्हें कौनसा चाहिए? –

+1

संबंधित http://stackoverflow.com/q/7477248/97777 –

+0

धन्यवाद डंकन, मैं इसे देख लूंगा। मैं उन गुणों को ढूंढने के तरीकों की तलाश में गया जिनके नाम उनके नाम से संबंधित नाम और प्रकार हैं। –

उत्तर

17

स्काला 2.10 प्रतिबिंब का उपयोग करना:

scala> import reflect.runtime.{universe => ru} 
import reflect.runtime.{universe=>ru} 
scala> trait A { val field1: Int; val field2: Char; def meth1: Int } 
defined trait A 
scala> val fieldSymbols = ru.typeOf[A].members.collect{ case m: ru.MethodSymbol if m.isGetter => m } 
fieldSymbols: Iterable[reflect.runtime.universe.MethodSymbol] = List(value field2, value field1) 

लौटे प्रतीक सभी प्रकार की जानकारी, जैसे:

scala> fieldSymbols.map(_.typeSignature) 
res16: Iterable[reflect.runtime.universe.Type] = List(=> scala.Char, => scala.Int) 
+1

अच्छी चीजें - आप वहां एक उत्तर जोड़ना चाहेंगे! –

+0

पोस्ट किया गया! मिशन पूरा हुआ, अब मैं सोने जा सकता हूं। –

+0

'संग्रह {केस एम: ru.MethodSymbol अगर m.isGetter => m} 'चेतावनी देता है" अमूर्त प्रकार पैटर्न ru.MethodSymbol अनचेक किया गया है क्योंकि इसे' विधिSymbol' 'के लिए मिटा दिया जाता है। अब तक सुनिश्चित नहीं है कि इसे कैसे खत्म किया जाए। –

6

आप इस document on reflecting scala पर एक नज़र डालना चाहते हैं। getMethods जावा प्रतिबिंब से एक विधि है। आप वहां क्या नहीं ढूंढ सकते? Javadoc से:

  • स्ट्रिंग getName(): स्ट्रिंग के रूप में इस विधि ऑब्जेक्ट द्वारा प्रस्तुत विधि का नाम देता है।
  • कक्षा [] getParameterTypes(): क्लास ऑब्जेक्ट्स की एक सरणी देता है जो इस विधि ऑब्जेक्ट द्वारा प्रस्तुत विधि के घोषणा क्रम में, औपचारिक पैरामीटर प्रकारों का प्रतिनिधित्व करता है।
  • कक्षा getReturnType(): एक क्लास ऑब्जेक्ट देता है जो इस विधि ऑब्जेक्ट द्वारा प्रस्तुत विधि के औपचारिक रिटर्न प्रकार का प्रतिनिधित्व करता है।

आप Java reflection के बारे में अधिक पढ़ सकते हैं।

ध्यान दें कि erasure की वजह से सभी प्रकार की जानकारी रनटाइम पर उपलब्ध नहीं होगी।

+0

धन्यवाद मैं उस परियोजना के बारे में जानता हूं और वास्तव में पहले से ही अपनी lib डाउनलोड कर चुका हूं, लेकिन मैं इसे संकलित नहीं कर सकता क्योंकि इसमें 2.9.1 के साथ बहुत सारे संघर्ष हैं जिनका मैं उपयोग कर रहा हूं। आपको जावा प्रतिबिंब को समझाने की आवश्यकता नहीं है। जो मैं खोज रहा था वह स्कैला में इससे निपटने के साफ तरीके थे। प्रतिबिंब के साथ मेरी समस्याएं यह है कि स्कैला फ़ील्ड बिल्कुल प्रस्तुत नहीं किए जाते हैं और 'getMethods' जेनरेट किए गए तरीकों का एक समूह देता है जिसे फ़िल्टर करने की आवश्यकता होती है और मैं उम्मीद कर रहा था कि इसके लिए एक सतत एल्गोरिदम मौजूद था। मान लीजिए मुझे * मिरर * कोड का विश्लेषण करना होगा। –

+0

ऐसा लगता है कि आपका प्रश्न http://stackoverflow.com/questions/2204057/reflection-api-for-scala का डुप्लिकेट है। – schmmd

+0

लिंक मर चुका है, एक अद्यतन लिंक की सराहना की जाएगी (मुझे नहीं पता कि क्या देखना है)। –

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