2015-12-30 4 views
8

Ich möchte alle Fallklassen auflisten, die ein bestimmtes Merkmal implementiert. Ich verwende derzeit Clapper ClassUtil dafür. Ich bin in der Lage, Fallklassen zu erhalten, die ein Merkmal direkt implementieren. Ich bin jedoch nicht in der Lage, die anderen Klassen zu bekommen, die das Merkmal nicht direkt implementieren. Wie bekomme ich alle Klassen, die direkt oder indirekt ein Merkmal implementieren? ?Holen Sie alle Klassen, die ein Merkmal in Scala implementiert mit Reflexion

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

Scala Version: 2.11

Clapper Klasse Util Version: 1.0.6

Gibt es irgendeine andere Weise, die ich diese Informationen bekommen? Kann mir jemand in die richtige Richtung zeigen? Ich versuchte mit scala.reflect aber konnte nicht verstehen, wie man die Informationen bekommt.

EDIT: 

Probeneigenschaften und Verwendungen:

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 

Nun, wenn ich die Eigenschaft als NamedEntity geben, sollte ich in der Lage sein, sowohl Department und User zu bekommen, da sie beide direkt oder indirekt NamedEntity implementieren. Mit implements Methode wird es nur Benutzer geben. Ich habe auch versucht, mit interfaces Methode, die auch nur die direkten Super-Klassen bieten wird.

+0

Könnten Sie drei Merkmale/Klassen und ihre Beziehung definieren, um das Problem zu demonstrieren? –

+0

Ich habe die Beispielmerkmale und Fallklassenverwendungen hinzugefügt. –

Antwort

4

Mit Blick auf die source code scheint das Problem zu sein, dass es nicht die Schnittstellenhierarchie folgt. Wenn Sie das tun, finden Sie alle Instanzen:

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

Vielen Dank, das hat es gelöst .. :) –

Verwandte Themen