2015-12-30 14 views
8
Ben belli bir özelliği uygular tüm vaka sınıflarını dışarı listelemek istediğiniz

kullanarak Scala'da bir özelliği uygular tüm sınıfları alın. Bunu yapmak için şu anda Clapper ClassUtil kullanıyorum. Bir özelliği doğrudan uygulayan vaka sınıflarını alabiliyorum. Ancak, doğrudan özelliği olmayan diğer sınıfları elde edemiyorum. Bir özelliği doğrudan veya dolaylı olarak uygulayan tüm sınıfları nasıl alabilirim. ?yansıması

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

Scala Versiyon: 2.11

Klaket Sınıf Util Versiyon: 1.0.6

Bunları bilgi alabilirsiniz başka bir yolu var mı? Birisi beni doğru yöne yönlendirebilir mi? Ben scala.reflect kullanarak çalıştı ama bilgi almak için nasıl anlayamadık.

EDIT: 

Numune özellikleri ve kullanımları: Ben NamedEntity olarak özelliği verirsen

Şimdi
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 

, ben her ikisi de doğrudan veya dolaylı NamedEntity uyguladıklarını beri hem Department ve User almak gerekir. implements yöntemle, sadece kullanıcı verecektir. Ayrıca da sadece doğrudan süper sınıfları sağlayacaktır interfaces yöntemi kullanılarak çalıştı.

+0

üç özellikleri/sınıfları tanımlamak Could ve ilişkilerini: Bunu yaparsanız, tüm örneklerini bulmak? –

+0

Ben örnek özellikleri ve vaka sınıf kullanımlarını ekledik. –

cevap

4

source code bakıldığında, sorun arayüzleri hiyerarşi takip etmediğini gibi görünüyor. Sorunu göstermek için

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

Çok teşekkür ederim, bunu çözdü .. :) –

İlgili konular