gpt4 book ai didi

scala - 循环遍历Scala中包中的每个类

转载 作者:行者123 更新时间:2023-12-04 15:26:49 24 4
gpt4 key购买 nike

有没有办法可以“循环”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 没有特定的反射/内省(introspection)系统,但您可以自由使用 Java。在这种特殊情况下,您可以移植 Java 端使用的一种技术来列出包中的所有类,例如如此处所示(请务必在评论中选择版本):

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

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

我看到一些警告:

  • 与 Java 一样,您只能看到某个类加载器可见的类(这可能是一个问题,例如在 OSGi 应用程序中)
  • 该操作在 Java 中足够昂贵,在 Scala 中更是如此,因为 scalac 为代码中生成的所有匿名函数生成了许多额外的类,由于 filter、map、flatMap 等方法,这可能是一个很大的数字. 您可以尝试根据他们的名字过滤掉他们。
  • 关于scala - 循环遍历Scala中包中的每个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5645012/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com