2015-12-30 14 views
8

特定の特性を実装するすべてのケースクラスをリストしたいと思います。私は現在、そのためにClapper ClassUtilを使用しています。私は、特性を直接実装しているケースクラスを得ることができます。しかし、私は、その特性を直接的に実装していない他のクラスを手に入れることはできません。どのようにして、直接的または間接的に特性を実装するすべてのクラスを得ることができますか。 ?反射を使用してScalaの特性を実装するすべてのクラスを取得する

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

Scalaのバージョン: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を実装しているので、私はDepartmentUserの両方を得ることができる必要があります。 implementsメソッドを使用すると、ユーザーのみが表示されます。私はinterfacesメソッドを使って試してみました。このメソッドはダイレクトスーパークラスも提供します。

+0

問題を示すために3つの特性/クラスとその関係を定義できますか? –

+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

ありがとう、それはそれを解決した.. :) –

関連する問題