कैसे कुछ इस तरह के बारे में:
def getTraitsExtending(clazz:Class[_], baseTrait:Class[_]): Seq[Class[_]] = {
clazz.getInterfaces().filter { baseTrait isAssignableFrom _ }
}
यह सभी लक्षण पता चलता है कि clazz
लागू करता है कि खुद को baseTrait
की subtraits हैं। निम्नलिखित लक्षण के साथ:
trait A
trait B extends A
trait C extends A
trait D
उपयोग इस प्रकार है:
scala> val x1 = new C with B
x1: java.lang.Object with C with B = [email protected]
scala> getTraitsExtending(x1.getClass, classOf[A])
res0: Seq[Class[_]] = WrappedArray(interface C, interface B)
scala> val x2 = new C with A
x2: java.lang.Object with C with A = [email protected]
scala> getTraitsExtending(x2.getClass, classOf[A])
res1: Seq[Class[_]] = WrappedArray(interface C, interface A)
scala> val x3 = new C with D
x3: java.lang.Object with C with D = [email protected]
scala> getTraitsExtending(x3.getClass, classOf[A])
res3: Seq[Class[_]] = WrappedArray(interface C)
यह केवल इंटरफेस कि सीधे उदाहरण में पारित के वर्ग द्वारा कार्यान्वित किया जाता पर लग रहा है, लेकिन रिकर्सिवली देखने के लिए बढ़ाया जा सकता है विरासत पदानुक्रम ऊपर।
स्रोत
2010-05-11 14:53:51
के बारे में मैं इस स्पष्ट विधि के बारे में सोचा था, लेकिन यहाँ पूछने के लिए क्योंकि लक्षण के रूप में मैं परिष्कृत तरीके में संकलन कर सकते हैं का फैसला किया। – Jeriho
भाषा सुविधाओं के पर्याप्त होने पर प्रतिबिंब का उपयोग करने का कभी भी सहारा लें। –
सहमत हुए। मैंने पहली बार इंस्टेंसऑफ का उपयोग किया - जिसने अपने प्रश्न के शरीर को जवाब दिया। लेकिन जब मैंने अपने वास्तविक प्रश्न शीर्षक "गुणों की सूची कैसे प्राप्त करें ..." को फिर से पढ़ा, तो मैंने इंटरफेस प्राप्त करने के लिए स्विच किया। –