使用反射获取在Scala中实现特征的所有类

时间:2015-12-30 13:41:20

标签: scala reflection traits

我想列出实现特定特征的所有案例类。我目前正在使用Clapper ClassUtil来执行此操作。我能够获得直接实现特征的案例类。但是,我无法获得其他没有直接实现特征的类。如何获得直接或间接实现特征的所有类。 ?

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

Scala版本:2.11

Clapper Class 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,我应该能够同时获得DepartmentUser,因为它们都直接或间接地实现了NamedEntity。使用implements方法,它只会给用户。我也试过使用interfaces方法,它也只提供直接超类。

2 个答案:

答案 0 :(得分:4)

查看source code,问题似乎是它不遵循接口层次结构。如果您这样做,您会找到所有实例:

class YourClassName
{
    int b;
    void Start()
    {
        StartCoroutine("MyEvent");
        b = 100; //some number
    }

    private IEnumerator MyEvent()
    {
        while(true)
        {
            yield return new WaitForSeconds(1); // wait a second
            b--;
        }
    }
}

答案 1 :(得分:1)

ClassUtil现在contains this functionality(v1.4.0,也许在更早的版本中):

val finder = ClassFinder()
val impl = ClassFinder.concreteSubclasses("foo.NamedEntity", finder.getClasses())