2012-06-16 10 views
17

W dawnych czasach, gdy Invocation, narzędzie doświadczalny był część biblioteki standardowej, można powołać się metody „dynamiczny”, jak przedstawiono poniżej:„dynamiczne” wywołania metody z nowym Scala odbicia API

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

Jak zrobić to za pomocą nowego interfejsu API Scala reflection?

+0

Dlaczego chcesz wywoływać metody w środowisku wykonawczym, gdy znasz już ich nazwy/identyfikatory/parametry? Czy jest coś, czego nie możesz osiągnąć podczas kompilacji? – sschaef

+0

@ Antoras, tylko ciekawy. Nie bardzo używam tych rzeczy w produkcji. – missingfaktor

Odpowiedz

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 

Kilka podstawowych informacji o tym, jak zaprojektować API, można znaleźć tutaj: Get companion object instance with new Scala reflection API.

Powiązane problemy