2012-10-15 10 views
16

लगता है कि यह मेरे करीब हो जाता है की तरह है, लेकिन (क) काफी नहीं (नीचे देखें), और (ख) एक नाम की स्ट्रिंग प्रतिनिधित्व का उपयोग कर एक हैक की तरह लगता है ...स्कैला (2.10) प्रकार टैग या प्रतीक से जावा क्लास प्राप्त करने का कोई तरीका?

scala> import scala.reflect.runtime.universe._import scala.reflect.runtime.universe._ 

scala> val t = typeOf[Int] 
t: reflect.runtime.universe.Type = Int 

scala> t.typeSymbol.asClass.fullName 
res0: String = scala.Int 

scala> object X { class Y } 
defined module X 

scala> val y = typeOf[X.Y] 
y: reflect.runtime.universe.Type = X.Y 

scala> Class.forName(y.typeSymbol.asClass.fullName) 
java.lang.ClassNotFoundException: X.Y [...] 

मैं कुछ और अधिक लापता रहा हूँ इस जानकारी तक पहुंचने की सीधी विधि? या यह सबसे अच्छा होगा, अगर मुझे किसी भी समय कक्षा की जानकारी की आवश्यकता है, तो बस जावा क्लास की जानकारी के समानांतर सेट को रखने के लिए? (ओह!)

+0

यदि आप किसी भी प्रकार के किसी भी प्रकार का उदाहरण प्राप्त कर सकते हैं, तो क्या आप सिर्फ java.lang.Object-y goodness पर वापस नहीं आ सकते हैं, और myObj.getClass()। GetName() को कॉल कर सकते हैं? उदाहरण के लिए –

+0

, वस्तु X {वर्ग Y} परिभाषित मॉड्यूल एक्स स्केला> (नई XY) .getClass.getName res7: java.lang.String = एक्स $ Y –

+0

एक त्वरित सुझाव के रूप में, चलाने की कोशिश 'स्केला -Xprint : टाइपर 'यह देखने के लिए कि आरईपीएल वास्तव में एक्स को अपनी वस्तुओं में लपेट रहा है या नहीं। – pedrofurla

उत्तर

23

प्रतिबिंब के साथ एक java.lang.Class या instantiating वस्तुओं प्राप्त एक दर्पण के साथ किया जाना चाहिए और न प्रकार के और प्रतीकों, जो स्काला के लिए संकलन समय जानकारी कर रहे हैं के साथ:

scala> val m = runtimeMirror(getClass.getClassLoader) 
m: reflect.runtime.universe.Mirror = JavaMirror with ... 

scala> m.runtimeClass(typeOf[X.Y].typeSymbol.asClass) 
res25: Class[_] = class X$Y 
+0

वह केवल "कक्षा की जानकारी" कहता है, तत्काल का कोई उल्लेख नहीं है। लेकिन फिर भी, यह हो सकता है उसके उपयोग के मामले ... – pedrofurla

+0

यह करने के लिए प्रकट होता है यही कारण है, जब तक आप ऐसा के रूप में सही वर्ग लोडर चयन करने के लिए। – Tim

+4

'ClassMirror.runtimeClass' कार्यक्षमता को आरसी 1 से हटा दिया गया है, क्योंकि वहां एक छोटा विकल्प है: बस' m.runtimeClass (typeOf [X.Y] .typeSymbol.asClass) '। –

4

tag मान लिया जाये प्रकार टैग है वर्ग आप के लिए जावा वर्ग प्राप्त करना चाहते हैं, आप कह सकते हैं:

val mirror = tag.mirror 
val clazz = mirror.runtimeClass(tag.tpe.typeSymbol.asClass) 

मूल रूप से sschaef के जवाब के रूप में ही है, सिवाय इसके कि आप दर्पण सीधे टैग से, बजाय वर्तमान CLA के दर्पण का उपयोग करने का उपयोग करना चाहिए एस 'क्लासलोडर। यदि वर्तमान वर्ग और दूसरी कक्षा जिसमें आपके पास अलग-अलग क्लासलोडर का उपयोग करने के लिए टैग है, तो उस मामले में आपके पास एक क्लासलोडिंग त्रुटि होगी, लेकिन जिस तरह से मैंने समझाया है, उसमें कोई त्रुटि नहीं है।

clazz वैरिएबल जो भी आप प्राप्त करने की कोशिश कर रहे हैं उसके लिए जावा क्लास आयोजित करेगा।

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