Scala 使用新的反射API,如何找到类的主构造函数?

Scala 使用新的反射API,如何找到类的主构造函数?,scala,reflection,Scala,Reflection,您可以获得一个类的所有构造函数,如下所示: import scala.reflect.runtime.universe._ val ctor = typeOf[SomeClass].declaration(nme.CONSTRUCTOR).asTerm.alternatives 有没有办法知道哪一个是主构造函数?它总是列表中的第一个吗? 如果Java中定义了SomeClass,而主构造函数的概念不存在,会发生什么情况?是的,有一个名为isPrimaryConstructor的方法正是这样做的

您可以获得一个类的所有构造函数,如下所示:

import scala.reflect.runtime.universe._

val ctor = typeOf[SomeClass].declaration(nme.CONSTRUCTOR).asTerm.alternatives
有没有办法知道哪一个是主构造函数?它总是列表中的第一个吗? 如果Java中定义了
SomeClass
,而主构造函数的概念不存在,会发生什么情况?

是的,有一个名为
isPrimaryConstructor
的方法正是这样做的:

val primary: Option[MethodSymbol] = typeOf[SomeClass].declaration(
  nme.CONSTRUCTOR
).asTerm.alternatives.collectFirst {
  case ctor: MethodSymbol if ctor.isPrimaryConstructor => ctor
}

对于Java类,只需在源文件中定义第一个构造函数。

Hmm。。。这在编译器阶段(后期打字机、预pickler)内不起作用。我只得到带有
声明
成员
的空对象。有什么想法吗?虚惊一场。是的。我传入了
ClassDef.tpe
而不是
ClassDef.symbol.tpe