là có tương đương với sự phản ánh java foo.getClass().getFields()
trong Kotlin? Tôi chỉ có thể thấy rằng tôi có thể truy cập một trường khi tôi biết tên của nó, nhưng tôi muốn xử lý các trường theo cách chung chung.kotlin phản ánh có được danh sách các lĩnh vực
Trả lời
Bạn không thể làm điều này trong Kotlin, nhưng có một cách không đáng tin cậy bẩn để làm điều này trong java. Bạn có thể sử dụng sự phản chiếu java. Như thế này:
public class TestClass {
trait EmptyTrait
class EmptyClass
public var anotherVar:Int? = null
public val contant:Float = 10f
private var emptyTrait:EmptyTrait? = null
val emptyClass:EmptyClass = EmptyClass()
public fun setVal(fieldName: String, value: Int) {
javaClass.getDeclaredField(fieldName).set(this, value);
}
public fun getFieldNames(): String {
return javaClass.getDeclaredFields().map{it.getName()}.join(", ")
}
}
Hãy thử nghiệm nó:
val t = TestClass()
Log.v("MainActivity", "Fields: " + t.getFieldNames())
Log.v("MainActivity", "anotherVar: " + t.anotherVar)
t.setVal("anotherVar", 10)
Log.v("MainActivity", "anotherVar: " + t.anotherVar)
Kết quả:
Fields: anotherVar, emptyClass, emptyTrait, contant, $kotlinClass
anotherVar: null
anotherVar: 10
nó hoạt động)
Đó không phải là những gì tôi cần, tôi muốn lặp lại trên các lĩnh vực của các lớp (có thể có bất kỳ số lĩnh vực với tên mà tôi không biết), do đó câu hỏi cho một "danh sách" (của bất kỳ loại) .. – fwilhe
có phương pháp getFields, một lúc) – Leonidos
Phản ánh Kotlin có thể làm điều này dễ dàng hơn nhiều, câu hỏi đặt ra là ... –
Bạn có muốn các lĩnh vực như trong "lĩnh vực sao lưu" hoặc các lĩnh vực như trong "tài sản" ... Kotlin thực sự chỉ có tài sản. Bạn có thể có được những đối với một số lớp học sử dụng:
MyTest::class.memberProperties
// or
MyTest::class.declaredMemberProperties
Và từ một Java Class<T>
, sử dụng tài sản kotlin
mở rộng để có được Kotlin KClass<T>
mà từ đó bạn có thể tiếp tục:
someClassOfMine.javaClass.kotlin.memberProperties
này đòi hỏi sự kotlin-reflect
phụ thuộc cũng như được thêm vào xây dựng và classpath của bạn. Bạn sẽ tìm thấy nhiều điều bổ ích khác trên KClass
Đối với các lĩnh vực ủng hộ bí mật đằng sau một bất động sản, sử dụng Java phản ánh nguy cơ của riêng bạn.
Rất dễ dàng bây giờ với Kotlin v1.1, Bạn có thể sử dụng phương pháp sau đây để có được các trường trong Kotlin
val fields = MyClass.javaClass.kotlin.members
đâu MyClass là lớp bạn đã chọn.
Để sử dụng này, bạn cần phải có Kotlin-phản ánh trong gradle xây dựng tập tin của bạn như sau
compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
Bên cạnh đó, nó cũng có thể để có được các lĩnh vực từ JavaClass trực tiếp nếu bạn cần lĩnh vực java (hữu dụng trong một số trường hợp như những bao gồm một phạm vi hơi khác nhau)
val fields = MyClass.javaClass.declaredFields
- 1. Lấy danh sách các lĩnh vực với chú thích, bằng cách sử dụng phản ánh
- 2. Extract danh sách lĩnh vực từ reStructuredText
- 3. Lĩnh vực dự phòng Kotlin là gì?
- 4. Kotlin iterator vào danh sách?
- 5. Kotlin phản ánh người bảo vệ SmallSortedMap
- 6. Thêm lĩnh vực bí danh MySQL cùng
- 7. Đặt giá trị lĩnh vực tư nhân với sự phản ánh
- 8. Phản ánh qua danh sách bộ điều khiển
- 9. Phản ánh bộ lọc truy vấn theo danh sách?
- 10. Sử dụng phản ánh để có danh sách các lớp tĩnh
- 11. Java8: giá trị tổng từ lĩnh vực cụ thể của các đối tượng trong danh sách
- 12. Kotlin - Làm thế nào để làm cho lĩnh vực read-only cho các lớp bên ngoài
- 13. Truy cập lĩnh vực Django.choices
- 14. Kotlin. Làm thế nào để kiểm tra xem trường là nullable thông qua sự phản ánh?
- 15. Lấy chỉ lĩnh vực tĩnh khai báo trong Java lớp
- 16. Phản ánh lấy thuộc tính đối tượng để sắp xếp danh sách
- 17. C++ Initialising lĩnh vực trực tiếp vs danh sách khởi tạo trong constructor mặc định
- 18. Nhận loại có trong Danh sách <T> thông qua phản ánh?
- 19. Lĩnh vực trên Android - Cách chọn nhiều đối tượng theo danh sách id (@PrimaryKey)?
- 20. Lĩnh vực: Kết quả <T> als Danh sách <T>
- 21. Hủy bỏ bản sao từ danh sách dựa trên nhiều lĩnh vực hoặc cột
- 22. Làm thế nào để sắp xếp một danh sách bằng lĩnh vực
- 23. động thêm các mục vào một danh sách <T> qua phản ánh
- 24. Tuyên bố một lĩnh vực Danh sách với từ khóa thức
- 25. Danh sách lười biếng trong kotlin?
- 26. Sắp xếp một danh sách trong EmberJS và có phản ánh trong giao diện
- 27. lĩnh vực trong mẫu
- 28. Java bằng(): để phản ánh hoặc không phản ánh
- 29. Pre động điền các lĩnh vực unmapped
- 30. Danh sách chỉnh sửa của Kotlin
AFAIK nó đang được phát triển. Vui lòng gắn dấu sao hoặc bỏ phiếu cho vấn đề có liên quan (https://youtrack.jetbrains.com/issue/KT-6570) để nhận nội dung cập nhật. – bashor
Cảm ơn, câu trả lời cho câu hỏi của tôi. Tôi không thể tìm thấy nút để "chấp nhận" bạn trả lời .. – fwilhe
Bạn được chào đón! Không thể đánh dấu nhận xét. – bashor