我有这样的课:
trait ThirdParty { def invoke = println("right") }
trait WeatherIcon { def invoke = println("wrong") }
class MyClass {
object objA extends ThirdParty
object objB extends WeatherIcon
}
Run Code Online (Sandbox Code Playgroud)
如何使用Scala反射API迭代包含的对象并调用方法(如果它是ThirdParty类的实例)?
我想列出实现特定特征的所有案例类.我目前正在使用Clapper ClassUtil来做到这一点.我能够获得直接实现特征的案例类.但是,我无法获得其他没有直接实现特征的类.如何获得直接或间接实现特征的所有类.?
val finder = ClassFinder()
finder.getClasses().filter(_.isConcrete).filter(_.implements("com.myapp.MyTrait"))
Run Code Online (Sandbox Code Playgroud)
Scala版本: 2.11
Clapper Class Util版本: 1.0.6
有没有其他方法可以获得这些信息?有人能指出我正确的方向吗?我尝试使用scala.reflect但无法理解如何获取信息.
EDIT:
Run Code Online (Sandbox Code Playgroud)
样本特征和用法:
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
Run Code Online (Sandbox Code Playgroud)
现在,如果我给出特征NamedEntity,我应该能够同时获得两者Department,User因为它们都直接或间接地实现了NamedEntity.使用implements方法,它只会给用户.我也试过使用interfaces方法,它也只提供直接超类.
scala反射API(2.10)是否提供了更简单的方法来搜索加载的类并将列表过滤到实现已定义特征的特定类?即;
trait Widget {
def turn(): Int
}
class Cog extends Widget {
def turn() = {
5
}
}
class Sprocket extends Widget {
def turn() = {
10
}
}
Run Code Online (Sandbox Code Playgroud)
我想在类库中搜索扩展Widget并实例化这些类的任何内容.所以我最终会得到一个Cog和的实例Sprocket.
我在Java中完成了类似的迭代,通过类目录,形成类名并使用Class.forName加载一个Class对象然后检查.我只是想知道scala反射API是否提供了更简单的搜索方式.到目前为止我看到的所有示例都始终从已知的类实例化开始,而不是从可用类的搜索开始.