Kotlin-43.Java調用kotlin之一(Call Kotlin from Java)

官方文檔: http://kotlinlang.org/docs/reference/java-to-kotlin-interop.html

1.kotlin屬性(Properties)

Kotlin屬性會被編譯成以下Java元素:
    1.getter方法,名稱是在kotlin屬性名前加get並且屬性名首字母大寫;
    2.setter方法(只適用於var屬性),名稱是在kotlin屬性名前加set並且屬性名首字母大寫;
    3.private私有字段,名稱與kotlin屬性同名(只適用於具有幕後字段[backing field]的屬性)

    如果kotlin屬性名以is開頭,則java名稱映射規則不同: getter名與屬性名相同,setter名是將is替換爲set;
    提示: 這一規則適用於任何類型的屬性,不僅限於Boolean

示例1:
    // kotlin代碼:            
        var firstName: String // Kotlin屬性

    // 對應的Java代碼:
        // java私有字段
        private String firstName; 

        // getter方法
        public String getFirstName() { 
            return firstName;
        }

        // setter方法
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }

示例2:
    // kotlin代碼:            
        var isOpen: Boolean // Kotlin屬性

    // 對應的Java代碼:            
        private Boolean isOpen; // java私有字段

        // getter方法
        public Boolean isOpen() { 
            return firstName;
        }

        // setter方法
        public void setOpen(Boolean isOpen) {
            this.isOpen = isOpen;
        }

2.kotlin包級函數(Package-Level Functions)

1.在demo包內的example.kt文件中聲明的所有函數和屬性(包括擴展函數),
都被編譯成一個名爲demo.ExampleKt的Java類的靜態方法:
    // kotlin代碼(example.kt文件)
        package demo

        class Foo
        fun bar() {
        }

    // Java調用kotlin
        new demo.Foo();
        demo.ExampleKt.bar(); // 把example.kt大寫變成ExampleKt類

2.可以使用@JvmName註解修改生成的Java類名:
    // kotlin代碼(example.kt文件)
        @file:JvmName("DemoUtils")
        package demo

        class Foo
        fun bar() {
        }

    // Java調用kotlin
        new demo.Foo();
        demo.DemoUtils.bar();

3.如果多個不同文件的包名相同且@JvmName註解相同,可用@JvmMultifileClass註解,編譯器能夠生成一個單一Java外觀類
    // kotlin代碼(oldutils.kt文件)
        @file:JvmName("Utils")
        @file:JvmMultifileClass
        package demo

        fun foo() {
        }

    // kotlin代碼(newutils.kt文件)
        @file:JvmName("Utils")
        @file:JvmMultifileClass
        package demo

        fun bar() {
        }

    // Java調用kotlin
        demo.Utils.foo();
        demo.Utils.bar();

3.實例對象字段(Instance Field)

在Java中將Kotlin屬性作爲字段暴露,需要用@JvmField註解標註,該字段的可見性與底層屬性相同;
如果kotlin屬性有幕後字段(backing field),且沒有private/open/override/const修飾符,且不是委託屬性;
那麼可以用@JvmField註解該kotlin屬性!
    // kotlin
    class C(id: String) {
        @JvmField val ID = id
    }

    // Java
    class JavaClient {
        public String getID(C c) {
            return c.ID;
        }
    }

延遲初始化(Late-Initialized)屬性在Java中也會暴露爲字段,該字段的可見性與lateinit屬性setter相同!   

簡書:http://www.jianshu.com/p/1cf85aa9fcfc
CSDN博客: http://blog.csdn.net/qq_32115439/article/details/75268938
GitHub博客:http://lioil.win/2017/07/17/Kotlin-kotlinInJava.html
Coding博客:http://c.lioil.win/2017/07/17/Kotlin-kotlinInJava.html

發佈了156 篇原創文章 · 獲贊 38 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章