加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

循环遍历Scala中的每个类

发布时间:2020-12-16 18:50:14 所属栏目:安全 来源:网络整理
导读:有没有办法可以“循环” Scala中指定包中的类集? 用例是管理从BaseService特征继承的一组服务,这些特性通过提供的名称暴露给REST API. Manager类需要能够提供服务列表以及验证所提供的服务是否存在,如果存在,则将其实例化为执行重载函数. 我的想法是这样的
有没有办法可以“循环” Scala中指定包中的类集?

用例是管理从BaseService特征继承的一组服务,这些特性通过提供的名称暴露给REST API. Manager类需要能够提供服务列表以及验证所提供的服务是否存在,如果存在,则将其实例化为执行重载函数.

我的想法是这样的伪代码:

for ( clazz <- com.demo.pkg ) {
    val service = Class.forName(clazz).newInstance
    registerService( service )
}

而不是实例化,同名对象上的静态方法提供服务名称和描述可能会更好.

在Python中,这是微不足道的,因为dir()并且由于类加载器函数在PHP中相当容易,但我是Scala的新手.

此外,我知道我可能正在接近这个错误,并欢迎反馈.

更新:

我接受了下面JPP的答案,但他说的是,这对于日常操作而言过于昂贵.所以我需要改变我的方法.而管理器类将维护一个静态的服务clases列表.虽然从开发角度来看并不理想,但运行时速度增益似乎非常值得.

解决方法

目前(2.8.1 / 2.9),Scala没有特定的反射/内省系统,但您可以自由使用Java.在这种特殊情况下,您可以移植Java端使用的一种技术来列出包中的所有类,例如,如此处所示(请务必在评论中选择版本):

http://snippets.dzone.com/posts/show/4831

这种技术实际上不使用Java反射来查找类;它基本上做的是通过ClassLoader可用的所有资源并检查哪些是.class文件.

我看到一些警告:

>与Java一样,您只能看到某个类加载器可见的类(这可能是一个问题,例如在OSGi应用程序中)> Java中的操作非常昂贵,在Scala中更是如此,因为scalac为代码中生成的所有匿名函数生成了许多其他类,由于filter,map,flatMap等方法,这些函数可能很多.您可以尝试根据其名称过滤掉它们.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读