Làm thế nào về một cái gì đó như thế này:
def getTraitsExtending(clazz:Class[_], baseTrait:Class[_]): Seq[Class[_]] = {
clazz.getInterfaces().filter { baseTrait isAssignableFrom _ }
}
này tìm tất cả các đặc điểm mà clazz
cụ mà mình subtraits của baseTrait
. Với những đặc điểm sau đây:
trait A
trait B extends A
trait C extends A
trait D
Sử dụng như sau:
scala> val x1 = new C with B
x1: java.lang.Object with C with B = [email protected]
scala> getTraitsExtending(x1.getClass, classOf[A])
res0: Seq[Class[_]] = WrappedArray(interface C, interface B)
scala> val x2 = new C with A
x2: java.lang.Object with C with A = [email protected]
scala> getTraitsExtending(x2.getClass, classOf[A])
res1: Seq[Class[_]] = WrappedArray(interface C, interface A)
scala> val x3 = new C with D
x3: java.lang.Object with C with D = [email protected]
scala> getTraitsExtending(x3.getClass, classOf[A])
res3: Seq[Class[_]] = WrappedArray(interface C)
này chỉ nhìn vào giao diện được các thực hiện trực tiếp bởi lớp của các trường hợp được thông qua năm, nhưng có thể được mở rộng để đệ quy tìm kiếm lên hệ thống phân cấp thừa kế.
Nguồn
2010-05-11 14:53:51
Tôi đã nghĩ về phương pháp hiển nhiên này nhưng quyết định hỏi ở đây vì những đặc điểm như tôi biết có thể biên dịch một cách tinh vi. – Jeriho
Không bao giờ sử dụng sự phản chiếu khi ngôn ngữ có đủ điều kiện. –
Đồng ý. Lần đầu tiên tôi sử dụng isInstanceOf - câu trả lời cho câu hỏi của anh ấy. Nhưng tôi đã chuyển sang getInterfaces khi tôi đọc lại tiêu đề câu hỏi thực tế của mình "Cách lấy danh sách các đặc điểm ...". –