在 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 类的主要内容,如果未能解决你的问题,请参考以下文章
我可以从 Avro 模式定义中获取 Scala 案例类定义吗?