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
Hiện tại không có nhiều hỗ trợ phản chiếu trong Scala. Nhưng bạn có thể quay lại Java Reflection API thứ. Nhưng có một số trở ngại:
Bạn phải tạo một Array[AnyRef]
và hộp "loại nguyên thủy" của mình trong các lớp wrapper (java.lang.Integer, java.lang.Character, java.lang.Double, ...
)
newInstance(Object ... args)
được một mảng varargs của Object
, vì vậy bạn nên cung cấp cho loại inferer một gợi ý với :_*
newInstance(...)
trả về một Object
vì vậy bạn phải cast nó trở lại với asInstanceOf[T]
Gần nhất tôi có thể nhận được chức năng instantiate
của bạn là thế này:
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
Bạn không thể có được lớp get từ một kiểu generic. Java xóa nó (loại tẩy xoá).
Edit: 20 Tháng Chín 2012
Ba năm trôi qua, các phương pháp instantiate
có thể được cải thiện để trả về một đối tượng đã gõ đúng.
Xem http://www.nabble.com/How-do-I-get-the-class-of-a-Generic--td20873455.html
Nguồn
2009-10-29 06:51:01
Sự phản ánh liên quan ở đây không liên quan gì đến các trường hợp cụ thể. Bạn chỉ cần một số phản ánh để định kiểu args. Nếu tôi sai, bạn có thể xây dựng được không? – HRJ
Bạn là đúng, ngoại trừ một phần của mục tiêu là để có thể viết các trường hợp đơn giản và sau đó sử dụng một phương pháp như thế này để khởi tạo/sửa đổi chúng. – justin