2012-06-16 39 views
17

Trong thời xa xưa, khi Invocation, một tiện ích thực nghiệm, là một phần của thư viện chuẩn, người ta có thể gọi các phương pháp "tự động" như hình dưới đây:"Dynamic" phương pháp gọi với mới Scala phản ánh API

"Hello!" o 'substring(0, 4) // to get Any back 
"Hello!" oo 'substring(0, 4) // for an automatic unsafe cast to expected type 

thế nào để làm điều này với API phản chiếu Scala mới?

+0

Tại sao bạn muốn gọi các phương thức trong thời gian chạy khi bạn đã biết tên/số nhận dạng/thông số của chúng? Có điều gì bạn không thể đạt được trong thời gian biên dịch không? – sschaef

+0

@Antoras, chỉ tò mò. Không thực sự sử dụng công cụ này trong sản xuất. – missingfaktor

Trả lời

22
Welcome to Scala version 2.10.0-20120617-072418-9a28ee1ffc (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_33). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> class Foo { def bar(x: Int) = x } 
defined class Foo 

scala> val foo = new Foo 
foo @ 5935b50c: Foo = [email protected] 

scala> runtimeMirror(getClass.getClassLoader).reflect(foo) 
res0 @ 65c24701: reflect.runtime.universe.InstanceMirror = [email protected]65c24701 

scala> res0.symbol.typeSignature.member(newTermName("bar")) 
res1 @ 69624a1c: reflect.runtime.universe.Symbol = method bar 

scala> res0.reflectMethod(res1.asMethodSymbol)(42) 
res2 @ 4ac1d188: Any = 42 

Một số thông tin cơ bản về cách thiết kế API có thể tìm thấy tại đây: Get companion object instance with new Scala reflection API.

Các vấn đề liên quan