2013-05-11 78 views
5

你可以得到這樣一個類的所有構造函數:使用新的反射API,如何找到一個類的主要構造函數?

import scala.reflect.runtime.universe._ 

val ctor = typeOf[SomeClass].declaration(nme.CONSTRUCTOR).asTerm.alternatives 

有沒有辦法知道哪一個是主構造?它總是列表中的第一個? 如果SomeClass是在Java中定義的,主構造函數的概念不存在會發生什麼情況?

回答

9

是的,有一個名爲isPrimaryConstructorMethodSymbolApi的方法,做正是這樣:

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

在Java類的情況下,你只得到源文件中定義的第一個構造函數。

+0

嗯......這不適用於編譯器階段(post-typer,pre-pickler)。我只是用'declaration'或'member'獲得null對象。有任何想法嗎? – gzm0 2013-12-17 12:24:18

+0

虛驚一場。它的確如此。我傳入'ClassDef.tpe'而不是'ClassDef.symbol.tpe' – gzm0 2013-12-17 12:28:08

相關問題