W programie Scala 2.10 w jaki sposób wygenerować klasę ze stringów (prawdopodobnie za pomocą zestawu narzędzi Toolbox) później, aby utworzyć instancję za pomocą refleksji Scali?Generowanie klasy z ciągu znaków i tworzenie jej w Scali 2.10
Odpowiedz
Przyborniki kompresji W.r.t mogą uruchamiać tylko wyrażenia = wartości zwracane, ale nie otrzymane klasy lub zbiory plików/bajtów z wynikami kompilacji.
Jednak to wciąż możliwe do osiągnięcia, co chcesz, ponieważ w Scala to tak łatwo przejść z poziomu typu do poziomu wartości za pomocą wartości ukryte:
Edit. W 2.10.0-RC1 zmieniono niektóre metody ToolBox
. parseExpr
jest teraz tylko parse
, a runExpr
nazywa się teraz eval
.
scala> import scala.reflect.runtime._ // requires scala-reflect.jar
// in REPL it's implicitly added
// to the classpath
// but in your programs
// you need to do this on your own
import scala.reflect.runtime
scala> val cm = universe.runtimeMirror(getClass.getClassLoader)
cm @ 41d0fe80: reflect.runtime.universe.Mirror = JavaMirror with scala.tools.nsc.interpreter.IMain$TranslatingClassLoader...
scala> import scala.tools.reflect.ToolBox // requires scala-compiler.jar
// in REPL it's implicitly added
// to the classpath
// but in your programs
// you need to do this on your own
import scala.tools.reflect.ToolBox
scala> val tb = cm.mkToolBox()
tb: scala.tools.reflect.ToolBox[reflect.runtime.universe.type] = [email protected]
scala> tb.runExpr(tb.parseExpr("class C; scala.reflect.classTag[C].runtimeClass"))
res2: Any = class __wrapper$1$f9d572ca0d884bca9333e251c64e980d$C$1
Aktualizacja # 1. Jeśli nie potrzebujesz klasy java.lang.Class i potrzebujesz tylko utworzyć instancję skompilowanej klasy, możesz napisać new C
bezpośrednio w ciągu znaków przesłanym do runExpr
.
Aktualizacja # 2. Możliwe jest również użycie niestandardowego mapowania od nazw zmiennych do wartości środowiska wykonawczego. Na przykład:
scala> val build = scala.reflect.runtime.universe.build
build: reflect.runtime.universe.BuildApi = [email protected]
scala> val x = build.setTypeSignature(build.newFreeTerm("x", 2), typeOf[Int])
x: reflect.runtime.universe.FreeTermSymbol = free term x
scala> tb.runExpr(Apply(Select(Ident(x), newTermName("$plus")), List(Literal(Constant(2)))))
res0: Any = 4
W tym przykładzie utworzyć wolnego terminu, który ma wartość 2 (wartość nie musi być prymitywny - może to być Twój obiekt niestandardowy) i powiązać identyfikator do niego. Ta wartość jest następnie używana jako-jest w kodzie, który jest skompilowany i uruchamiany przez przybornik.
W przykładzie wykorzystano ręczny montaż AST, ale możliwe jest napisanie funkcji, która analizuje ciąg znaków, wykrywa niezwiązane identyfikatory, wyszukuje wartości dla nich w niektórych mapowaniach, a następnie tworzy odpowiednie wolne terminy. W Scali 2.10.0 nie ma takiej funkcji.
- 1. Interpolacja łańcuchów znaków w Scali 2.10 - Jak interpolować zmienną String?
- 2. generowanie wyrażenia regularnego z ciągu znaków
- 3. Początkujący: alias typu Scala w Scali 2.10?
- 4. Tworzenie selektora właściwości Wyrażenie z ciągu znaków
- 5. Tworzenie klasy HttpBrowserCapabilities z ciągu UserAgent
- 6. Utwórz instancję klasy React z ciągu znaków
- 7. Uzyskiwanie typu klasy z ciągu znaków
- 8. Znajdowanie parametrów typu za pomocą odbicia w Scali 2.10?
- 9. Tworzenie oddzielonego ciągu znaków z zapytania w DB2
- 10. Dlaczego funkcja częściowo stosowana opóźnia tworzenie klasy w Scali?
- 11. generowanie losowego ciągu znaków w php dla nazwy pliku
- 12. Zastępowanie przestarzałego <: <świadka typu manifestu w Scali 2.10
- 13. jak utworzyć instancję klasy z ciągu znaków w swift 3
- 14. Jak utworzyć instancję klasy z ciągu znaków w Railsach?
- 15. Usuwanie znaków z ciągu znaków
- 16. Możliwy błąd w Scali 2.10: Futures nie działają
- 17. Generowanie losowego ciągu znaków UTF-8 w języku Python
- 18. Generowanie kombinacji podciągów z ciągu
- 19. zamień tablicę słów (ciągi znaków), aby wyodrębnić i użyj jej do uzyskania dopasowań na ciągu znaków.
- 20. JavaScript, sprawdź zmienną, używając ciągu znaków zawierającego jej nazwę?
- 21. Uzyskaj właściwość klasy PHP według ciągu znaków
- 22. Scala: Eleganckie przekształcenie ciągu znaków w boolean
- 23. Tworzenie losowego ciągu znaków z A-Z i 0-9 w Javie
- 24. Generowanie losowego ciągu znaków na podstawie wyrażenia regularnego
- 25. Usuwanie znaków niealfanumerycznych z ciągu znaków
- 26. Generowanie ciągu z CLLocationDegrees, np. w NSLog lub StringWithFormat
- 27. Usuwanie wielu typów znaków z ciągu znaków
- 28. Usuwanie określonych znaków z ciągu znaków
- 29. Sprawdź znaki specjalne (/ * - + _ @ i $ #%) w ciągu znaków?
- 30. Usuwanie zduplikowanych znaków z ciągu znaków
Dzięki! Jedna z obserwacji: czy istnieje sposób, aby uzyskać uchwyt na tym zwróconym 'java.lang.Class' z refleksją Scali, czy po prostu będę musiał trzymać się zwykłego starego Javy? –
Pewnie. Użyj ' .classSymbol ()', gdzie = 'scala.reflect.runtime.universe.runtimeMirror ( .getClassLoader)'. Otrzymasz symbol odbicia Scala, który można sprawdzić za pomocą interfejsu API Scala reflection. –
Dlaczego użyłeś 'universe.runtimeMirror (getClass.getClassLoader)' zamiast 'reflect.runtime.currentMirror' i' scala.reflect.classTag [C] .runtimeClass' zamiast 'classOf [C]'? Okazało się, że działa dobrze na moim końcu. Wielkie dzięki za pomoc, btw! –