官方文檔: 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