如何解决在Scala的包中循环遍历每个类
| 有没有一种方法可以“循环遍历” Scala中指定软件包中的一组类? 用例正在管理从BaseService特征继承的一组服务,这些服务通过提供的名称公开给REST API。 Manager类需要能够提供服务列表,并验证提供的服务是否存在,如果存在,则将其实例化以执行重载函数。 我的想法是这样的伪代码:for ( clazz <- com.demo.pkg ) {
val service = Class.forName(clazz).newInstance
registerService( service )
}
与实例化相比,在同名对象上提供服务名称和描述的静态方法可能更好。
在Python中,由于dir()的原因,这是微不足道的;而在PHP中,由于类加载器的功能,这相当容易,但是我对Scala还是陌生的。
另外,我知道我可能无法正确处理此问题,因此欢迎您提供反馈。
更新:
我已经接受了JPP的回答,但是他的正确做法对于常规操作而言太昂贵了。所以我需要改变我的方法。相反,管理器类将维护服务分类的静态列表。从开发角度看,这不是理想的,但运行时速度的提高似乎是值得的。
解决方法
目前(2.8.1 / 2.9),Scala没有特定的反射/自省系统,但是您可以自由使用Java。在这种情况下,您可以移植Java端使用的一种技术来列出包中的所有类,例如如此处所示(请务必在注释中选择版本):
http://snippets.dzone.com/posts/show/4831
实际上,该技术不使用Java反射来查找类。相反,它基本上所做的是遍历ClassLoader可用的所有资源,并检查哪些是“ 1”文件。
我看到一些警告:
与Java一样,您只能看到某个类加载器可见的类(这可能是个问题,例如在OSGi应用程序中)
在Java中,该操作非常昂贵,在Scala中甚至更昂贵,因为scalac会为代码中生成的所有匿名函数生成许多其他类,由于filter,map,flatMap等方法,该类可能会很多您可以尝试根据其名称将其过滤掉。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。