2015-12-30 28 views
8

का उपयोग कर स्कैला में एक विशेषता लागू करने वाली सभी कक्षाएं प्राप्त करें, मैं एक विशेष विशेषता लागू करने वाले सभी केस वर्गों को सूचीबद्ध करना चाहता हूं। मैं वर्तमान में ऐसा करने के लिए Clapper ClassUtil का उपयोग कर रहा हूं। मैं केस कक्षाएं प्राप्त करने में सक्षम हूं जो सीधे एक विशेषता लागू कर रहे हैं। हालांकि, मैं उन अन्य वर्गों को प्राप्त करने में सक्षम नहीं हूं जो सीधे विशेषता को कार्यान्वित नहीं कर रहे हैं। मैं उन सभी वर्गों को कैसे प्राप्त कर सकता हूं जो प्रत्यक्ष या अप्रत्यक्ष रूप से एक विशेषता लागू करते हैं। ?प्रतिबिंब

val finder = ClassFinder() 
finder.getClasses().filter(_.isConcrete).filter(_.implements("com.myapp.MyTrait")) 

स्काला संस्करण: 2.11

घंटे का लटकन कक्षा util संस्करण: 1.0.6

वहाँ किसी अन्य तरीके से मैं इन जानकारी प्राप्त कर सकते है? क्या कोई मुझे सही दिशा में इंगित कर सकता है? मैंने scala.reflect का उपयोग करने का प्रयास किया लेकिन यह समझ में नहीं आया कि जानकारी कैसे प्राप्त करें।

EDIT: 

नमूना लक्षण और उपयोगों:

trait BaseEntity 
trait NamedEntity{ val name:String} 
trait MasterDataEntity extends NamedEntity 

case class Department(id:Long, override val name:String) extends MasterDataEntity 
case class Employee(id:Long, name:String) extends BaseEntity 
case class User(id:Long, override val name:String) extends NamedEntity 

अब, अगर मैं NamedEntity के रूप में विशेषता देते हैं, मैं के बाद से वे दोनों प्रत्यक्ष या परोक्ष रूप NamedEntity कार्यान्वित कर रहे हैं दोनों Department और User प्राप्त करने में सक्षम होना चाहिए। implements विधि के साथ, यह केवल उपयोगकर्ता को देगा। मैंने interfaces विधि का उपयोग करके भी कोशिश की, जो केवल प्रत्यक्ष सुपर क्लास प्रदान करेगा।

+0

क्या आप समस्या का प्रदर्शन करने के लिए तीन लक्षण/कक्षाएं और उनके रिश्ते को परिभाषित कर सकते हैं? –

+0

मैंने नमूना लक्षण और केस क्लास उपयोग जोड़े हैं। –

उत्तर

4

source code पर देखकर, समस्या यह प्रतीत होती है कि यह इंटरफेस पदानुक्रम का पालन नहीं करता है। यदि आप ऐसा करते हैं, तो आपको सभी उदाहरण मिलते हैं:

package foo 

import java.io.File 

import org.clapper.classutil.{ClassFinder, ClassInfo} 

object Main extends App { 
    val jar  = new File("target/scala-2.11/class_test_2.11-0.1.0.jar") 
    val finder = ClassFinder(jar :: Nil) 
    val classes = ClassFinder.classInfoMap(finder.getClasses().iterator) 
    val impl = find("foo.NamedEntity", classes) 
    impl.foreach(println) 

    def find(ancestor: String, classes: Map[String, ClassInfo]): List[ClassInfo] = 
    classes.get(ancestor).fold(List.empty[ClassInfo]) { ancestorInfo => 
     val ancestorName = ancestorInfo.name 

     def compare(info: ClassInfo): Boolean = 
     info.name == ancestorName || 
     (info.superClassName :: info.interfaces).exists { 
      n => classes.get(n).exists(compare) 
     } 

     val it = classes.valuesIterator 
     it.filter { info => info.isConcrete && compare(info) } .toList 
    } 
} 
+0

बहुत बहुत धन्यवाद, यह हल किया .. :) –