scala> case class Foo(id:Long, name:String)
defined class Foo
scala> val constructor = classOf[Foo].getConstructors()(0)
constructor: java.lang.reflect.Constructor[_] = public Foo(long,java.lang.String)
scala> val args = Array[AnyRef](new java.lang.Integer(1), "Foobar")
args: Array[AnyRef] = Array(1, Foobar)
scala> val instance = constructor.newInstance(args:_*).asInstanceOf[Foo]
instance: Foo = Foo(1,Foobar)
scala> instance.id
res12: Long = 1
scala> instance.name
res13: String = Foobar
scala> instance.getClass
res14: java.lang.Class[_] = class Foo
Attualmente non c'è molto supporto per la riflessione in Scala. Ma puoi ricorrere all'API Java Reflection. Ma ci sono alcuni ostacoli:
È necessario creare un Array[AnyRef]
e la scatola tuoi "tipi primitivi" nelle classi wrapper (java.lang.Integer, java.lang.Character, java.lang.Double, ...
)
newInstance(Object ... args)
Ottiene una matrice varargs di Object
, così si dovrebbe dare il tipo inferer un suggerimento con :_*
newInstance(...)
restituisce un Object
quindi bisogna gettato indietro con asInstanceOf[T]
Il più vicino ho potuto ottenere per la vostra funzione instantiate
è questo:
def instantiate(clazz: java.lang.Class[_])(args:AnyRef*): AnyRef = {
val constructor = clazz.getConstructors()(0)
return constructor.newInstance(args:_*).asInstanceOf[AnyRef]
}
val instance = instantiate(classOf[MyClass])(new java.lang.Integer(42), "foo")
println(instance) // prints: MyClass(42,foo)
println(instance.getClass) // prints: class MyClass
Non è possibile ottenere la classe ottenere da un tipo generico. Java lo cancella (tipo cancellato).
Edit: September 20 2012
Tre anni dopo, il metodo instantiate
può essere migliorato per restituire un oggetto correttamente digitato.
Vedi http://www.nabble.com/How-do-I-get-the-class-of-a-Generic--td20873455.html
fonte
2009-10-29 06:51:01
Il riflesso qui coinvolto non ha nulla a che vedere con le classi di casi in particolare. Hai solo bisogno di un po 'di riflessione per digitare gli argomenti. Se sbaglio, puoi elaborare? – HRJ
Sei corretto, eccetto che parte dell'obiettivo è essere in grado di scrivere semplici case classes e quindi usare un metodo come questo per istanziarle/modificarle. – justin