2016-10-01 15 views
10

Tôi muốn thực hiện chức năng đặc biệt nếu tôi gặp phải một lớp Kotlin so với một lớp Java chung. Làm thế nào tôi có thể phát hiện nếu nó là một lớp Kotlin?Tôi muốn phát hiện xem một lớp JVM là một lớp Kotlin hay không

Tôi đã hy vọng rằng việc gọi someClass.kotlin sẽ ném một ngoại lệ hoặc thất bại nếu lớp học không phải là Kotlin. Nhưng nó kết thúc tốt đẹp các lớp Java. Sau đó, tôi nhận thấy rằng nếu tôi làm someClass.kotlin.primaryConstructor nó có vẻ là null cho tất cả các lớp java ngay cả khi họ có một constructor mặc định, đó là một dấu hiệu tốt? Nhưng điều đó có thể trả về null cho một lớp học Kotlin không?

Cách tốt nhất để nói "đây có phải là lớp Kotlin không?"

Trả lời

10

Kotlin thêm chú thích cho tất cả các lớp của nó và bạn có thể kiểm tra sự tồn tại của nó một cách an toàn theo tên. Đây là một chi tiết triển khai và có thể thay đổi theo thời gian, nhưng một số thư viện chính sử dụng chú thích này để nó có thể được ok vô thời hạn.

fun Class<*>.isKotlinClass(): Boolean { 
    return this.declaredAnnotations.any { 
     it.annotationClass.qualifiedName == "kotlin.Metadata" 
    } 
} 

Có thể được sử dụng như:

someClass.isKotlinClass() 

Lớp kotlin.Metadata không được truy cập trực tiếp bởi vì nó được đánh dấu internal trong thời gian chạy Kotlin.

+0

Tại sao không so sánh trực tiếp lớp học? 'it.annotationClass == Metadata :: class' – Raman

+1

Lớp không truy cập được, là' nội bộ ' –

+0

Ah. Dường như nó có thể truy cập được từ Java. Ví dụ, tôi đã viết yêu cầu kéo (unmerged) này cho Spring Framework: https://github.com/spring-projects/spring-framework/pull/1060/files#diff-244315b45582a5b7573a15644b16c373R48 (có, họ muốn nó được viết bằng Java , eek). – Raman

Các vấn đề liên quan