2015-02-08 16 views
12

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

+4

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

+0

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

+0

Bạn được chào đón! Không thể đánh dấu nhận xét. – bashor

Trả lời

1

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)

+0

Đó 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

+0

có phương pháp getFields, một lúc) – Leonidos

+0

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à ... –

7

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.

0

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 
Các vấn đề liên quan