Trong Scala 2.10 làm cách nào để tạo một lớp từ chuỗi (có lẽ, sử dụng hộp công cụ api) sau này để được khởi tạo với sự phản chiếu của Scala?Tạo một lớp từ chuỗi và khởi tạo nó trong Scala 2.10
Trả lời
W.r.t hộp công cụ biên dịch chỉ có thể chạy biểu thức = giá trị trả về, nhưng không thể tạo các lớp hoặc tệp/mảng byte với kết quả biên dịch.
Tuy nhiên nó vẫn có thể đạt được những gì bạn muốn, vì trong Scala nó rất dễ dàng để đi từ cấp loại mức giá trị sử dụng giá trị tiềm ẩn:
Sửa. Trong 2,10.0-RC1 một số phương pháp của ToolBox
đã được đổi tên. parseExpr
hiện chỉ là parse
và runExpr
hiện được gọi là 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
Cập nhật # 1. Nếu bạn không cần java.lang.Class và chỉ cần khởi tạo lớp đã biên dịch, bạn có thể viết trực tiếp new C
trong chuỗi được gửi đến runExpr
.
Cập nhật # 2. Cũng có thể có runExpr
sử dụng ánh xạ tùy chỉnh từ tên biến đến giá trị thời gian chạy. Ví dụ:
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
Trong ví dụ này tôi tạo điều khoản miễn phí có giá trị 2 (giá trị không phải là một nguyên thủy - nó có thể là đối tượng tùy chỉnh của bạn) và ràng buộc một định danh với nó. Giá trị này sau đó được sử dụng như là trong mã được biên soạn và chạy bởi một hộp công cụ.
Ví dụ sử dụng lắp ráp thủ công AST, nhưng có thể viết một hàm phân tích chuỗi, tìm ra số nhận dạng không liên kết, tra cứu giá trị cho chúng trong một số ánh xạ và sau đó tạo các thuật ngữ miễn phí tương ứng. Không có chức năng như vậy trong Scala 2.10.0 mặc dù.
- 1. Khởi tạo một lớp từ tên văn bản của nó
- 2. Khởi tạo một lớp học từ một chuỗi
- 3. Khởi tạo một lớp Python từ tên
- 4. Khởi tạo một lớp bằng trình khởi tạo siêu lớp
- 5. chồng typesafe và Scala 2.10
- 6. khởi tạo một lớp bằng biến chuỗi trong C#?
- 7. toArray trong Scala 2.10 Milestone
- 8. Scala 2.10, Double.isNaN và boxing
- 9. Trong Scala 2.10, làm thế nào để bạn tạo một ClassTag cho một TypeTag
- 10. lớp khởi tạo từ đối tượng lớp
- 11. Khởi tạo một đối tượng mới từ lớp trong Enum
- 12. Khởi tạo lớp C++ chứa khởi tạo biến lớp
- 13. khởi tạo tăng :: multi_array trong một lớp
- 14. Có thể tạo một số lớp cấp cao nhất với một lời gọi macro trong scala 2.10 không?
- 15. Khởi tạo giá trị Scala
- 16. Sự khác biệt giữa việc khởi tạo một lớp và khởi tạo một đối tượng?
- 17. Làm thế nào để khởi tạo các lớp bên trong trong một bước trong Scala?
- 18. làm thế nào để khởi tạo một đối tượng của lớp từ chuỗi trong Objective-C?
- 19. java, khởi tạo lớp con từ SuperClass
- 20. Generics generics trong Scala 2.10
- 21. Hai bộ tham số hàm tạo trong một lớp scala
- 22. khởi tạo lớp động
- 23. .NET - cách tạo một lớp sao cho chỉ có một lớp cụ thể khác có thể khởi tạo nó?
- 24. Cách khởi tạo một lớp học?
- 25. Khởi tạo một lớp Scala từ Java, và sử dụng các thông số mặc định của các nhà xây dựng
- 26. Tạo một lớp PHP -> Tạo một đối tượng của nó trong một lớp khác
- 27. scala - lấy lớp từ một chuỗi
- 28. Có cách nào để khởi tạo một lớp theo tên của nó trong delphi?
- 29. Scala 2.10 và gói phản chiếu
- 30. Scala - Khởi tạo môi trường REPL
Cảm ơn! Một theo dõi: có cách nào để tôi có được một xử lý trên này trở lại 'java.lang.Class' với sự phản ánh của Scala hoặc tôi sẽ chỉ phải dính vào đồng bằng cũ của Java? –
Chắc chắn. Sử dụng ' .classSymbol ()', trong đó = 'scala.reflect.runtime.universe.runtimeMirror ( .getClassLoader)'. Sau đó, bạn nhận được một biểu tượng phản chiếu Scala, có thể được kiểm tra bằng API phản chiếu Scala. –
Tại sao bạn sử dụng 'universe.runtimeMirror (getClass.getClassLoader)' thay vì 'reflect.runtime.currentMirror' và' scala.reflect.classTag [C] .runtimeClass' thay vì 'classOf [C]'? Hóa ra là tôi đang làm việc tốt cho đến cuối cùng. Cảm ơn rất nhiều cho sự giúp đỡ, btw! –