Kotlin-42.kotlin調用Java之四(Call Java from Kotlin)

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

繼續上一章

10.Object類方法(Object Methods)

在Kotlin中導入(import)Java類型時,java.lang.Object類都(映射)轉成kotlin.Any!
但時Any不是平臺指定,kotlin.Any成員只有toString(),hashCode(),equals(),
所以爲了使用java.lang.Object的其它成員,Kotlin.Any需要添加擴展函數,如下所示:  

1.wait()/notify()
在《Effective Java》第69條建議優先使用併發工具(concurrency utilities),不建議使用wait()和notify()!
因此在kotlin中Any類型不提供wait()和notify()方法!
如果需要在Kotlin調用它們,可將kotlin類轉換爲java.lang.Object,例如:
    //foo是kotlin類,所有kotlin類都繼承Any類
    (foo as java.lang.Object).wait()

2.getClass()
在Kotlin中獲取對象的Java class類,可在類引用(對象)上使用java擴展屬性:
    //foo是kotlin對象,fooClass是java class
    //1.使用自Kotlin 1.1起支持的綁定類引用(bound class reference)
    val fooClass = foo::class.java

    //2.也可以使用javaClass擴展屬性:
    val fooClass = foo.javaClass

3.clone()
在kotlin中重寫/覆蓋clone()方法,需要繼承kotlin.Cloneable,例如:
    class Example : Cloneable {
        override fun clone(): Any {
        }
    }
別忘了《Effective Java》第11條: 謹慎(Override)覆蓋clone()方法!

4.finalize()
在kotLin中覆蓋finalize(),只需簡單地聲明它,而不需要override關鍵字(無需繼承/實現):
    class C {
        //根據Java規則,finalize()不能爲private 
        protected fun finalize() {                
            // 結束邏輯                           
        }
    }

11.Java類(Java class)

1.訪問java類的靜態成員(static members)
在kotlin中Java類的靜態成員會形成該類的伴生對象(companion object),無法將伴生對象作爲值來傳遞,
但可以顯式訪問其成員,例如:
    //Character是java類,isLetter()是靜態成員,但在kotlin是伴生對象的成員
    if (Character.isLetter(a)) {       
    }

2.Java反射(Java Reflection)
在Kotlin中可以使用Java反射,可以通過instance::class.java, instance.javaClass, 
ClassName::class.java (其中instance是實例對象,ClassName是類)    
獲取java.lang.Class類,從而使用Java反射相關的方法類庫!

其它情況支持包括:
    爲Kotlin屬性獲取Java字段的getter/setter方法或者幕後字段,
    爲Java字段獲取Kotlin屬性(KProperty)
    爲Kotlin函數(KFunction)獲取Java方法或者構造函數,反之亦然!

12.SAM轉換(SAM Conversions)

像Java 8一樣,Kotlin支持SAM轉換(Single Abstract Method),
意味着Kotlin函數字面值可被自動轉換成只有一個非默認方法的Java接口實現!
SAM轉換隻適用於接口,而不適用於抽象類,即使抽象類只有一個抽象方法!
SAM轉換隻適用於kotlin與Java互操作,因爲Kotlin不需要將函數自動轉換爲Kotlin接口實現!

總結: 說白了就是爲了在kotlin對Java方法使用lambda表達式,SAM轉換例子:
    val runnable = Runnable {
        println("This runs in a runnable")
    }

    val executor = ThreadPoolExecutor()

    //Java類execute方法只有一個參數(接口)
    executor.execute {
         println("This runs in a thread pool")
    }

    //Java類execute方法有多個參數(接口)
    executor.execute(Runnable { println("This runs in a thread pool") })

13.在Kotlin中使用JNI

聲明一個在本地(C或C++)代碼中實現的函數,需要使用external修飾符標記:
    external fun foo(x: Int): Double
其餘過程與Java的JNI工作方式完全相同

CSDN博客: http://blog.csdn.net/qq_32115439/article/details/75208980
GitHub博客:http://lioil.win/2017/07/16/Kotlin-javaInKotlin4.html
Coding博客:http://c.lioil.win/2017/07/16/Kotlin-javaInKotlin4.html

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