2011-09-19 16 views
31

स्कैला 2.10 इसके अलावा प्रतिबिंब लाता है जो JVM (या मुझे लगता है कि सीएलआर) प्रदान करता है।स्कैला 2.10 से हम किस प्रतिबिंब क्षमताओं की अपेक्षा कर सकते हैं?

हमें विशेष रूप से क्या देखना है, और प्लेटफॉर्म पर यह कैसे सुधार होगा?

उदाहरण के लिए, क्या ऐसी कक्षा होगी जो फ़ील्ड और एक्सेसर विधियों के बीच भाषा की परिवर्तनीयता को प्रतिबिंबित करे, ताकि मैं किसी ऑब्जेक्ट के गुणों पर पुन: सक्रिय हो सकूं?

+3

प्रतिबिंब। सुधारो ... हम्म। –

+0

अरे, मैं वास्तव में उदाहरण चाहता हूं - अब एक बक्षीस है! –

+0

खैर, अभी भी कोई वास्तविक उदाहरण नहीं है, और यह प्रश्न अब 'स्कैला प्रतिबिंब 2.10' हो हम के लिए Google की शीर्ष हिट है, @ वोनसी में मुझे लगता है, लेकिन अगर कोई मुझे उपयोगकर्ता-स्तरीय कोड दिखा सकता है तो भी मैं आभारी रहूंगा। –

उत्तर

14

अद्यतन 2012-07-04:

Daniel SOBRAL (भी on SO) ने अपने ब्लॉग पोस्ट "JSON serialization with reflection in Scala! Part 1 - So you want to do reflection?" प्रतिबिंब के साथ आ सुविधाओं में से कुछ में विवरण:

पुनरावृत्ति करने के लिए, स्काला 2.10 होगा एक स्काला प्रतिबिंब पुस्तकालय के साथ आओ।
उस लाइब्रेरी का उपयोग संकलक द्वारा ही किया जाता है, लेकिन the cake pattern के माध्यम से परतों में विभाजित है, इसलिए अलग-अलग उपयोगकर्ता विवरण के विभिन्न स्तर देखते हैं, प्रत्येक के उपयोग के लिए जार आकार को पर्याप्त रखते हुए, और उम्मीद है कि अवांछित विवरण छुपाएं।

प्रतिबिंब पुस्तकालय भी आगामी मैक्रो सुविधाओं के साथ एकीकृत करता है, एंटरप्राइज़िंग कोडर को संकलित समय पर कोड में हेरफेर करने में सक्षम बनाता है।


अद्यतन 2012-06-14। (Eugene Burmako से):
Scala 2.10.0-M4 में, हम नए प्रतिबिंब एपीआई कि सबसे अधिक संभावना महत्वपूर्ण परिवर्तन के बिना 2.10.0 फाइनल में कर देगा जारी किया है।
API के बारे में अधिक जानकारी पाया जा सकता है:

अर्क:

ब्रह्माण्डों और दर्पण अब अलग संस्थाएं हैं:

  • मेजबान प्रतिबिंब कलाकृतियों ब्रह्मांडों (पेड़, प्रतीक, प्रकार, आदि), उन कलाकृतियों की
  • दर्पण सार लोड हो रहा है (उदाहरण के लिए JavaMirror एक वर्ग लोडर और एनोटेशन अनपिकर का उपयोग करते हुए लोड करता है, जबकि ग्लोबलमिरर एक ही लक्ष्य को प्राप्त करने के लिए आंतरिक कंपाइलर classreader का उपयोग करता है)।

लोक प्रतिबिंब एपीआई scala.reflect.base और scala.reflect.api में विभाजित है।

  • पूर्व एक न्यूनतम स्नैपशॉट का प्रतिनिधित्व करता है जो के लिए पर्याप्त रूप से पर्याप्त है पेड़ों और प्रकारों का निर्माण।
  • निर्माण करने के लिए, लेकिन विश्लेषण नहीं करना - सबकुछ स्मार्ट (उदाहरण के लिए, एक प्रकार का हस्ताक्षर प्राप्त करना) scala.reflect.api में लागू किया गया है। scala.reflect.basis और scala.reflect.runtime.universe:

दोनों प्रतिबिंब डोमेन को अपने स्वयं के ब्रह्मांड की है।

  • पूर्व हल्का है और यह किसी भी classloaders शामिल नहीं है,
  • जबकि बाद एक नीचे छीन संकलक प्रतिनिधित्व करता है।

प्रारंभिक जवाब, सितम्बर 2011:

आप Scala GitHub repo में प्रतिबिंबित पैकेज के विकास ने देख सकते हैं, यह दो बहुत ही हाल ही में प्रतिबद्ध के साथ:

वर्ग scala/reflect/internal/Importers.scala (Liftcode जा रहा है, this thread के अनुसार, "लेखन कोड है कि कोड लिखते हैं," सरल बनाने के उद्देश्य) (बनाया कल!) उन नवीनतम प्रतिबिंब सुविधा का उपयोग कर का एक अच्छा उदाहरण है।

+0

जिथब काम करने के लिए दोनों लिंक अब मौजूद नहीं हैं। –

+1

@ ओम-नाम-नाम: लिंक बहाल किए गए। वे अब [विरासत-svn-scala] (https://github.com/scala/legacy-svn-scala) repo में उपलब्ध हैं। – VonC

+0

@ यूजीन: संपादन के लिए धन्यवाद। मैंने कुछ लिंक और संदर्भ जोड़ने की स्वतंत्रता ली। – VonC

11

दो लिंक जो ब्याज की होनी चाहिए:

    प्रतिबिंब एपीआई पर
  • स्केला-internals mailing list discussion
  • 2.10-SNAPSHOT के लिए रात का निर्माण api doc

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

+0

धन्यवाद, मेलिंग सूची विकी की ओर जाता है - https://wiki.scala-lang.org/display/SIW/Reflection –

+0

लेकिन विकी थ्रेड को डिस्टिल करने का प्रयास नहीं करता है। –

+0

और स्पष्ट रूप से यह सब मेरे लिए बिल्कुल अपारदर्शी है! –

5

वर्तमान 2 के साथ।10M4 आप पहले से ही एक वर्ग के सदस्यों से अधिक पुनरावृति कर सकते हैं:

reflect.runtime.universe.typeOf[MyClass].members.filter(!_.isMethod) 

ऊपर कोड Symbol वस्तुओं एक वर्ग MyClass के सदस्यों का प्रतिनिधित्व करने को सूचीबद्ध करता है जो तरीकों नहीं हैं। इस तरीके को ठीक करने के कई तरीके हैं।

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