有没有办法可以"循环"Scala中指定包中的类集?
用例是管理从BaseService特征继承的一组服务,这些特性通过提供的名称暴露给REST API.Manager类需要能够提供服务列表以及验证所提供的服务是否存在,如果存在,则将其实例化为执行重载函数.
我的想法是这样的伪代码:
for ( clazz <- com.demo.pkg ) {
val service = Class.forName(clazz).newInstance
registerService( service )
}
Run Code Online (Sandbox Code Playgroud)
而不是实例化,同名对象上的静态方法提供服务名称和描述可能会更好.
在Python中,这是微不足道的,因为dir()并且由于类加载器函数在PHP中相当容易,但我是Scala的新手.
此外,我知道我可能正在接近这个错误,并欢迎反馈.
更新:
我接受了下面JPP的答案,但他说的是,这对于日常操作而言过于昂贵.所以我需要改变我的方法.而管理器类将维护一个静态的服务clases列表.虽然从开发角度来看并不理想,但运行时速度增益似乎非常值得.
目前(2.8.1/2.9),Scala 没有特定的反射/内省系统,但您可以自由使用 Java 的。在这种特殊情况下,您可以移植 Java 端使用的一种技术来列出包中的所有类,例如如下所示(请务必在注释中选择版本):
http://snippets.dzone.com/posts/show/4831
该技术实际上不使用 Java 反射来查找类;而是使用 Java 反射来查找类。它基本上所做的就是遍历类加载器可用的所有资源并检查哪些是.class文件。
但我看到一些警告: