Class 在Scala中获取Main的类

Class 在Scala中获取Main的类,class,scala,main,Class,Scala,Main,如果我创建一个没有伴生类的单例对象Main,有没有办法获取该单例的类classOf[Main]给出一个错误:“未找到:键入Main”。单例对象(也称为模块)没有“类”,因为您无法从它们继承。把独生子女和阶级看作是相反的概念 但它们确实有一种类型: object Main def test(a: Main.type): Unit = println("Got: " + a) test(Main) 因为它是一个类的实例,所以可以使用方法Main.getClass来完成这个类 在幕后,JVM知道

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

单例对象(也称为模块)没有“类”,因为您无法从它们继承。把独生子女和阶级看作是相反的概念

但它们确实有一种类型:

object Main

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

test(Main)

因为它是一个类的实例,所以可以使用方法
Main.getClass
来完成这个类

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


话虽如此,在Scala中通常很少需要反射,所以除非您刚刚了解了一点有趣的理论,否则不应该真正需要反射。

用例:
val buildNumber=try{new Manifest(新URL(“jar:+classOf[Main].getProtectionDomain.getCodeSource.getLocation+!/META-INF/Manifest.MF”).openStream).getMainAttributes.getValue(“内部版本号”)}catch{case\uz:ZipException=>“0”}
如果您想使用它来启动一个主方法的程序,该方法是同名类的伴生对象的一部分-它将不起作用。Scala只对非伴星对象的主方法进行了特殊处理,不管出于什么原因。@Madoc:我想这在2.8.0中已经修复了。在任何情况下,我仍然创建一个没有伴星的
Main
对象。它通常只包含
main
方法。这里的“类”和“类型”有什么区别?正如我所说的,模块不是一个可以从中继承的类。所以Main是一个值(“实例”)而不是一个类。Main.type为您提供值的“单例类型”。另请参见(单件类型)一段