2013-12-11 18 views
5

Tôi đang sử dụng các phương pháp sau đây trong scala để có được giữ của tất cả các lĩnh vực trong một lớp học:Tìm các thành viên tổng hợp trong các lĩnh vực lớp học tại Scala

val fields = contract.getClass.getDeclaredFields.toList.map(value => { 
    value.setAccessible(true) 
    value.getName 
}) 

contract đã được định nghĩa như là một lớp trong mã của tôi. Vì tôi đang sử dụng sự phản chiếu, vấn đề là tôi nhận được một phần tử khác $jacocoData là một trong các trường. Tôi muốn bỏ qua trường này. Cách 'hacky' để làm điều đó là biết thực tế là nó luôn được thêm vào cuối danh sách, vì vậy tôi có thể 'sửa' nó bằng cách thay đổi chữ ký chức năng của tôi thành số productArity và chỉ lấy số lượng arity đầu tiên này:

def getFields(contract: Contract, arity: Int): List[String] = { 
    val fields = contract.getClass.getDeclaredFields.toList.map(value => { 
    value.setAccessible(true) 
    value.getName 
    }) 
//to ignore $jacocoData (Java code coverage) field 
val firstnFields = fields.take(arity) 
firstnFields 
} 

Theo điểm cuối cùng của this FAQ, tôi cần phải thoát khỏi tắt các thành viên tổng hợp của một lớp. Làm thế nào để làm điều đó?

Trả lời

6

Chỉ cần giả định rằng $jacocoData luôn là yếu tố cuối cùng nguy hiểm, như Class#getDeclaredFields()does not guarantee any order.

Để kiểm tra xem một lĩnh vực là tổng hợp sử dụng Field#isSynthetic(), do đó, mã của bạn có thể được thay đổi để:

val fields = contract.getClass.getDeclaredFields. 
toList.withFilter(!_.isSynthetic()).map(value => { 
    value.setAccessible(true) 
    value.getName 
})            
Các vấn đề liên quan