Kotlin: Tương đương với getClass () cho KClass


92

Trong Java, chúng ta có thể giải quyết lớp của một biến thông qua getClass()như something.getClass(). Ở Kotlin, tôi nhận thức được something.javaClassđiều nào là tốt nhưng tôi muốn có thể có được điều KClassđó theo cách tương tự. Tôi đã xem Something::classcú pháp nhưng đây không phải là thứ tôi cần. Tôi cần lấy KClass của một biến. Chức năng đó có tồn tại không?

Câu trả lời:


142

Cách dễ nhất để đạt được điều này vì Kotlin 1.1 là cú pháp tham chiếu lớp :

something::class

Nếu bạn sử dụng Kotlin 1.0, bạn có thể chuyển đổi lớp Java thu được thành một cá thể KClass bằng cách gọi thuộc tính .kotlinmở rộng:

something.javaClass.kotlin

Bất kỳ nơi nào tôi có thể theo dõi việc triển khai một cái gì đó :: lớp?
Nishad

1
@Nishad Nơi dễ nhất là xem mã bytecode được tạo (ví dụ: với javap)
Alexander Udalov

2
Bạn cũng có thể sử dụng KClass::classđể lấy đối tượng lớp hiện tại.
Saminda Peramuna

1
Một cái gì đó cần lưu ý là something::classlợi nhuận KClass<out Something>trong khi something.javaClass.kotlinlợi nhuậnKClass<Something>
KylePlusPlus

1
@SamindaPeramuna Điều này sai, lớp KClass :: trả về đối tượng lớp kotlin.reflect.KClass không phải đối tượng lớp hiện tại! Để có được nó, bạn phải sử dụng this :: class.
Markus Kreusch

11

CHỈNH SỬA: Xem nhận xét, bên dưới và câu trả lời từ Alexander ở trên. Lời khuyên này ban đầu dành cho Kotlin 1.0 và có vẻ như bây giờ nó đã lỗi thời.

Vì ngôn ngữ này chưa hỗ trợ cách trực tiếp để có được điều này, hãy xem xét việc xác định một phương thức mở rộng ngay bây giờ .

fun<T: Any> T.getClass(): KClass<T> {
    return javaClass.kotlin
}

val test = 0
println("Kotlin type: ${test.getClass()}")

Hoặc, nếu bạn thích một tài sản:

val<T: Any> T.kClass: KClass<T>
    get() = javaClass.kotlin

val test = 0
println("Kotlin type: ${test.kClass}")

1
Bạn có thể bỏ qua một javachút và đi thẳng Kotlin:fun<T: Any> T.getClass(): KClass<out T> = this::class
TWiStErRob

1
Câu trả lời này cần được cập nhật để phản ánh những thay đổi trong 1.1. Bây giờ có thể sử dụng lớp họcsomeClass::class
Tối đa

2

Đây là giải pháp của tôi

val TAG = javaClass.simpleName

Với javaClass.simpleName, bạn có thể lấy tên lớp của mình. Ngoài ra, ví dụ trên rất hữu ích cho các nhà phát triển android khai báo trên đầu lớp như một biến thể hiện cho mục đích ghi nhật ký.


1

Dưới đây là các Triển khai khác nhau để lấy tên lớp. Bạn có thể sử dụng nó theo yêu cầu của bạn.

import kotlin.reflect.KClass

val <T : Any > T.kClassName: KClass<out T>
get() {
    return javaClass.kotlin
}

Ở đây chúng ta có thể lấy tên lớp trong kotlin

val <T : Any > T.classNameKotlin: String?
get() {
    return javaClass.kotlin.simpleName
}

Ở đây chúng ta có thể lấy tên lớp trong kotlin

val <T : Any > T.classNameJava: String
get() {
    return javaClass.simpleName
}

Đây là kết quả đầu ra cho các hoạt động sau.

fun main(){

val userAge = 0

println(userAge.kClassName) 
Output: class java.lang.Integer (Kotlin reflection is not available)

println(userAge.classNameKotlin)
Output: Int

println(userAge.classNameJava)
Output: Integer
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.