2010-02-04 18 views
12

के लिए प्रतिबिंब API क्या किसी को स्कैला के लिए पूरी तरह से विशेष रुप से प्रदर्शित प्रतिबिंब API की स्थिति पता है?स्कैला

मुझे पता है कि आप सरल चीजों को करने के लिए जावा के प्रतिबिंब एपीआई का उपयोग कर सकते हैं लेकिन यह स्कैला की भाषा सुविधाओं के साथ अच्छी तरह से काम नहीं करता है। मुझे एक प्रयोगात्मक स्कैला मिररिंग एपीआई का वर्णन करने वाला interesting article मिला लेकिन जहां तक ​​मुझे पता है कि यह अभी भी प्रयोगात्मक है। मुझे स्कैलासिग पार्सर का भी उल्लेख मिला है लेकिन यह बहुत कम स्तर लगता है।

यह किसी और चीज की तुलना में जिज्ञासा से अधिक है क्योंकि मैं वर्तमान में केवल स्कैला के साथ खेल रहा हूं। मैंने सोचा कि इस सवाल का जवाब स्कैला में दिलचस्पी रखने वालों के लिए भी उपयोगी हो सकता है।

+0

क्या आप प्रतिबिंबित करना चाहते हैं इसके बारे में अधिक विशिष्ट हो सकते हैं? आप नाम-मैंगलिंग में मदद के लिए scala.tools.nsc में रूटीन का उपयोग कर सकते हैं, और कुछ चीजें बस अच्छी तरह से प्रतिबिंबित नहीं होती हैं - आपको वास्तव में मदद करने के लिए संकलन की आवश्यकता होती है क्योंकि वे केवल मौजूदा तरीकों को कॉल करने की बात नहीं हैं (उदाहरण के लिए यदि आपको एक नया बंद करने की आवश्यकता है)। –

+0

सबसे पहले, मैं सोच रहा था कि नामित पैरामीटर वाले वर्गों के उदाहरण बनाना अच्छा होगा जैसे कि आपको पैरामीटर के क्रम के बारे में चिंता करने की ज़रूरत नहीं है - यह जावाबीन शैली पैटर्न के लिए एक अपरिवर्तनीय प्रतिस्थापन हो सकता है। मैं यह भी सोच रहा था कि कक्षा की संरचना को देखने में सक्षम होना अच्छा होगा क्योंकि यह स्कैला सुविधाओं से संबंधित है। अर्थात। मुझे सभी सीटीओ प्राप्त करें - प्राथमिक खोजें - इसे कॉल करें। या प्रश्नों का उत्तर दें जैसे यह क्षेत्र एक वैल या var है। इसके अलावा जावा के एपीआई पर वापस आने के बजाए मुहावरेदार स्कैला शैली में किए गए प्रतिबिंब एपीआई का उपयोग करना अच्छा होगा। बस विचार .. –

+0

मैं कुछ अधिक गतिशील मेटाप्रोग्रामिंग सुविधाओं के बारे में सोच नहीं रहा था जैसे रनटाइम या eval शैली विवरणों में विधियों को जोड़ना - जावा प्रतिबिंब एपीआई आपको स्केल भाषा के लिए अनुकूलित करने की अनुमति देता है। –

उत्तर

6

"JavaBean शैली पैटर्न के लिए अपरिवर्तनीय प्रतिस्थापन" नाम मापदंडों व्यक्त किया जा सकता है और @BeanProperty एनोटेशन वैकल्पिक:

import reflect._ 
case class A(@BeanProperty val x: String, @BeanProperty val y : Int) 

A(x = "s", y = 3) 
A(y = 3, x = "s") 

जोड़ना विधियों (अधिक सटीक: एक नया इंटरफेस को परिभाषित) एक स्थिर में केवल समझ में आता है टाइप की गई भाषा अगर ग्राहक नई विधियों के बारे में जानती है और इंटरफेस के खिलाफ संकलित कर सकती है। संरचनात्मक टाइपिंग क्लाइंट के साथ किसी ऑब्जेक्ट में मौजूद होने वाली विधियों को परिभाषित कर सकते हैं। स्कैला कंपाइलर संरचनात्मक प्रकार को प्रतिबिंब कोड में बदल देगा जो रनटाइम पर असफल हो सकता है।

type T = {def go(x : Int): Int } 
def y(any : Any) = any.asInstanceOf[T].go(2) 

class A{ 
    def go(x : Int) = x + 1 
} 
y(new A()) 
y(new {}) //this will fail 

आप तेज़ी से interpreter साथ नए वर्गों या लक्षण परिभाषित कर सकते हैं। व्याख्या विधि स्कैला कोड को बाइट कोड में बदल देती है।

आपने पहले से ही ScalaSigParser का उल्लेख किया है जो कि काम करने में बिल्कुल आसान नहीं है।

मुझे लगता है कि आपकी बाकी की विशेषताएं अभी तक नहीं हैं।

+0

यह संरचनात्मक प्रकारों के कारण नहीं, कास्टिंग के कारण रनटाइम पर विफल रहता है। –