2013-05-11 5 views
5

Sie können alle Konstrukteure einer Klasse wie diese:Verwenden Sie die neue Reflection-API, um den primären Konstruktor einer Klasse zu finden?

import scala.reflect.runtime.universe._ 

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

Gibt es eine Möglichkeit zu wissen, was man den primären Konstruktor ist? Ist es immer der erste in der Liste? Was passiert, wenn SomeClass in Java definiert ist, wo das Konzept primärer Konstruktor nicht existiert?

Antwort

9

Ja, es gibt eine Methode auf MethodSymbolApi genannt isPrimaryConstructor, die genau dies tut:

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

Im Falle einer Java-Klasse, die Sie erhalten nur den ersten Konstruktor in der Quelldatei definiert.

+0

Hmm ... Dies funktioniert nicht innerhalb einer Compiler-Phase (Post-Typer, Pre-Pickler). Ich bekomme nur null-Objekte mit 'declaration' oder' member'. Irgendwelche Ideen? – gzm0

+0

Fehlalarm. Es tut. Ich habe "ClassDef.tpe" anstelle von "ClassDef.symbol.tpe" übergeben – gzm0

Verwandte Themen