Khi tôi nghiên cứu một thư viện mới, đôi khi tôi thấy khó xác định vị trí thực hiện phương thức.phản ánh scala: getDeclaringTrait?
Trong Java, Metho # getDeclaringClass cung cấp lớp đã khai báo một phương thức đã cho. Vì vậy, bằng cách lặp qua lớp # getMethods, tôi có thể tìm cho mỗi phương thức, lớp đã khai báo nó. Trong Scala, các đặc tính được chuyển đổi sang các giao diện Java và một lớp mở rộng một đặc điểm sẽ thực hiện các phương thức của đặc điểm bằng cách chuyển tiếp chúng đến một lớp đồng hành xác định các phương thức này một cách tĩnh. Điều này có nghĩa là phương thứC# getDeclaringClass sẽ trả về lớp, không phải là đặc điểm:
scala> trait A { def foo = {println("hi")}}
defined trait A
scala> class B extends A
defined class B
scala> classOf[B].getMethods.find(_.getName() == "foo").get.getDeclaringClass
res3: java.lang.Class[_] = class B
Cách tốt nhất để giải quyết vấn đề này là gì? Có nghĩa là, cho một lớp, làm thế nào tôi có thể nhận được một List [(Method, Class)] trong đó mỗi tuple là một method và đặc điểm/class nó đã được khai báo trong đó?
bạn giả định rằng mọi thư viện đều được ghi lại tài liệu. và bên cạnh đó, câu hỏi của tôi là về sự phản chiếu nói chung, không phải là "làm thế nào tôi có thể nghiên cứu các thư viện mới". phần đó là để mọi người sẽ không bắt đầu hỏi "tại sao bạn cần sự phản chiếu như vậy?". – IttayD
Xác định những điều bạn hỏi (và bạn đã nói trong câu đầu tiên bạn đang nghiên cứu vào thư viện mới) có sẵn đáng tin cậy và hoàn toàn trong mã nguồn và do đó trong HTML Scaladoc. Hơn nữa, do tính chất của mối quan hệ giữa Scala và JVM, nhiều thông tin hơn sẽ luôn sẵn có thông qua nguồn thông qua mã bytecode. –