在 Scala 中获取 Main 类

Posted

技术标签:

【中文标题】在 Scala 中获取 Main 类【英文标题】:Getting the class for Main in Scala 【发布时间】:2011-06-04 16:05:39 【问题描述】:

如果我创建一个没有伴生类的单例对象Main,有没有办法获得该单例的类? classOf[Main] 给出错误:“未找到:键入 Main”。

【问题讨论】:

如果您想使用它来启动具有 main 方法的程序,该方法是同名类的伴随对象的一部分 - 它不起作用。无论出于何种原因,Scala 仅对非伴生对象的 main 方法进行特殊处理。 @Madoc:我认为这已在 2.8.0 中修复。无论如何,我仍然创建了一个没有同伴的 Main 对象。它通常只包含main 方法。 【参考方案1】:

单例对象,也就是模块,没有“类”,因为您不能从它们继承。将单例和类视为相反的概念。

他们确实有一个类型:

object Main

def test(a: Main.type): Unit = println("Got: " + a)

test(Main)

【讨论】:

这里的“class”和“type”有什么区别? 嗯,正如我所说,模块不是一个可以继承的类。所以 Main 是一个值(“实例”)而不是一个类。 Main.type 为您提供值的“单例类型”。参见programming-scala.labs.oreilly.com/ch12.html(Singleton Types 段),另见blogs.sun.com/sundararajan/entry/…【参考方案2】:

由于它是一个类的实例,您可以使用方法Main.getClass 来完成它。

在幕后,JVM 知道 Main 是名为 Main$ 的类的实例,如果需要,可以通过 Java 反射方法访问它。

说了这么多,Scala 中通常很少需要反射,所以你不应该真的需要这个,除非你只是在学习一些有趣的理论。

【讨论】:

用例:val buildNumber = try new Manifest(new URL("jar:" + classOf[Main].getProtectionDomain.getCodeSource.getLocation + "!/META-INF/MANIFEST.MF").openStream).getMainAttributes.getValue("Build-Number") catch case _: ZipException => "0"

以上是关于在 Scala 中获取 Main 类的主要内容,如果未能解决你的问题,请参考以下文章

Scala获取main函数参数,idea演示

我可以从 Avro 模式定义中获取 Scala 案例类定义吗?

如何在宏中获取Scala-macro-annotated类或对象的扩展类路径?

Scala - 从泛型类型获取类对象

通过给定的泛型类型 Scala 获取类的伴随对象

在Play和Scala中向case类获取请求参数