instanziieren Objekt mit der Reflexion über Konstruktor-Argumente
Ich versuche, herauszufinden, wie zu instanziieren Fall Klasse-Objekt mit reflektion. Gibt es Unterstützung für diese? Der nächste, den ich gekommen bin, sucht in der scala.reflektieren.Aufruf, aber dies scheint mehr für das ausführen von Methoden, die einen Teil eines Objekts.
case class MyClass(id:Long, name:String)
def instantiate[T](className:String)(args:Any*) : T = { //your code here }
Ist in der Nähe der API bin ich auf der Suche für.
Jede mögliche Hilfe würde geschätzt.
- Die Reflexion, die hier beteiligt sind, hat nichts zu tun mit case-Klassen speziell. Sie brauchen nur etwas reflektion zu festgelegten args. Wenn ich falsch bin, kannst du das etwas erläutern?
- Sie sind richtig, außer dass ein Teil des Ziel ist es, schreiben zu können, einfache case-Klassen und verwenden Sie dann eine Methode wie diese zu instanziieren/ändern können.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Derzeit gibt es nicht viel überlegung, Unterstützung für Scala. Aber Sie zurückgreifen können, um th Java-Reflection-API. Aber es gibt einige Hindernisse:
Erstellen Sie eine
Array[AnyRef]
box und Ihre "primitive Typen" in den wrapper-Klassen (java.lang.Integer, java.lang.Character, java.lang.Double, ...
)newInstance(Object ... args)
bekommt einen varargs-array vonObject
, so sollten Sie geben die Art inferer ein Hinweis mit:_*
newInstance(...)
gibt einObject
so Sie haben zu werfen es zurückasInstanceOf[T]
Der nächste, den ich bekommen konnte, um Ihre
instantiate
Funktion ist diese:Kommen Sie nicht an die Klasse abrufen von generischen Typen. Java löscht es (type erasure).
Änderung: 20 September 2012
Drei Jahren auf, die
instantiate
Methode kann verbessert werden, um wieder eine richtig typisiertes Objekt.Sehen http://www.nabble.com/How-do-I-get-the-class-of-a-Generic--td20873455.html
java.lang.Class.forName("Foo")
?Finden Sie die Antworten auf Scala: Wie kann ich dynamisch instanziieren ein Objekt und eine Methode aufzurufen, die mit der spiegelung?, insbesondere auch hinsichtlich der Art der Löschung.
Dies ist, was ich landete mit so weit möchte ich nicht haben, um sich direkt mit AnyRef, wenn möglich. Also, wenn jemand eine Möglichkeit kennt, das zu umgehen, würde ich mich über Hilfe freuen.