Java與Kotlin互調(diào)原理講解
一、Kt調(diào)用-Java參數(shù)非null的處理
@NotNull
class TestJava {
? ? public void toNotNull(@NotNull String title) {}
? ? public void toNull(String title){}
}Kotlin中調(diào)用

二、Kt調(diào)用- Java中使用kt關(guān)鍵字聲明的變量和方法
kotlin中調(diào)用java方法,參數(shù)時(shí),如果含有Kotlin關(guān)鍵字,必須增加 反引號(hào) ``
public Object object;
//使用kotlin中關(guān)鍵字命名的方法
public void is() {
}Kotlin中調(diào)用
?testJava.`is`() ?testJava.`object`
三、Kt調(diào)用Java-SAM轉(zhuǎn)換
在Kotlin中調(diào)用帶有接口參數(shù)的方法時(shí),如果這個(gè)接口只有一個(gè)方法,那么就可以通過(guò) lambda 表達(dá)式實(shí)現(xiàn) SAM轉(zhuǎn)換,從而簡(jiǎn)化我們的代碼。
示例如下:
public class TestJavaSam {
??
? ? void singleFun(@NotNull IListener iListener) {}
? ? void noParameter( @NotNull IListener iListener,int sum) {}
? ? void noParameterClean(int sum,@NotNull IListener iListener) {}
}
interface IListener {
? ? void onClick();
}在Kotlin中調(diào)用
fun main() {
? ? val sam = TestJavaSam()
? ? sam.singleFun {
? ? }
? ? sam.noParameter({
?? ??? ??? ?//如果更改一下java方法參數(shù)的順序,那么就會(huì)更簡(jiǎn)潔,如下
? ? },123)
? ? sam.noParameterClean(123){
? ? }
}四、Kt中禁止Java調(diào)用某方法
@JvmSynthetic
在Kotlin中,有些方法并不想暴露給Java調(diào)用,這時(shí)就可以增加這個(gè)注解在方法上。
@JvmSynthetic
fun toMain() {
}此時(shí)toMain() 在Java中將無(wú)法調(diào)用到。
五、Java調(diào)用Kt-擴(kuò)展函數(shù)
@file:JvmName(“xx”)
在java中使用Kotlin的擴(kuò)展函數(shù)時(shí),我們都會(huì)使用相應(yīng)的類(lèi)名+Kt 去調(diào)用相關(guān)的方法,有時(shí)候我們想自定義相應(yīng)的工具類(lèi),就顯得稍顯麻煩,如下:
比如我們有一個(gè)頂級(jí)擴(kuò)展函數(shù),位于 UiExpand.kt 中:
fun Int.px() {}
**Java中調(diào)用 **
? //Java調(diào)用kotlin類(lèi)-(UiExpand)-Int.px() 擴(kuò)展方法
? UiExpandKt.px(20);如上所示,在Java中調(diào)用時(shí),我們必須已文件名+kt后綴才可以調(diào)用。
通過(guò)給 UiExpand.kt 包名上增加 @file:JvmName(“Ui”),我們就可以實(shí)現(xiàn)自定義生成的類(lèi)名去調(diào)用
如下:
Ui.px()
六、Java調(diào)用kt-成員變量
@JvmField
在Java中,我們?nèi)フ{(diào)用Kotlin 的 成員變量 時(shí),編譯器都會(huì)幫我們自動(dòng)生成相應(yīng)的 get,set方法,這很符合Java Bean的寫(xiě)法,但是有些是有我們只是想直接去調(diào)用,這個(gè)時(shí)候就可以這樣去做。
Kotlin
data class TestKotlinBean(
? @JvmField val message: String,?
? @JvmField val title: String)
**Java中調(diào)用 **
?TestKotlinBean testKotlinBean = new TestKotlinBean("","");
?String message = testKotlinBean.message;
?String title = testKotlinBean.title;當(dāng)然對(duì)于 如下的示例,就算不用增加上面的注解,在java也都是可以直接調(diào)用,免除get,set。
lateinit var sum: String
object UserPicCache{
? ? ? ? const val KEY_CACHE = "CACHE"
?}@get:JvmName,@set:JvmName
有些時(shí)候,我們只是想讓其生成其中的一個(gè)set或者get方法,這個(gè)時(shí)候就可以使用上述注解。
Kotlin
data class TestKotlinBean(
? ? @set:JvmName("setMessage")
? ? var message: String,
? ? @get:JvmName("getTitle")
? ? val title: String
)Java中調(diào)用:
?TestKotlinBean testKotlinBean = new TestKotlinBean("", "");
?testKotlinBean.setMessage("message");
?testKotlinBean.getTitle();七、Java調(diào)用Kt-伴生對(duì)象
@JvmStatic
當(dāng)我們?cè)贘ava中調(diào)用 Kotlin 伴生對(duì)象的方法或者變量時(shí),必須通過(guò) 類(lèi)名.Companion.xx 的方式才可以調(diào)用。這時(shí)候,我們就可以增加
@JvmStatic 來(lái)直接調(diào)用。
Kotlin
class Log {
? ? companion object {
? ? ? ? var time: String = ""
? ? ? ? fun toLog() {
? ? ? ? }
? ? }
}在Java中調(diào)用:
?ToLog.toLog(); ?ToLog.getTime();
不過(guò)需要注意的是,@JvmStatic 對(duì)性能沒(méi)有任何提升,因?yàn)橄鄳?yīng)的,編譯器又生成了一個(gè)靜態(tài)方法,對(duì)于可變變量,會(huì)生成兩個(gè)靜態(tài)方法set,get。

八、Java調(diào)用Kt-方法默認(rèn)參數(shù)值
@JvmOverloads
在Kotlin中,對(duì)于方法參數(shù),我們可能會(huì)加入一些默認(rèn)值,便于更好的使用,但是在Java中,如果調(diào)用時(shí)不傳遞相應(yīng)的方法參數(shù),就會(huì)提示報(bào)錯(cuò),這種使用就可以使用@JvmOverloads 修飾方法。
kotlin
object DialogUtils {
? ? @JvmStatic
? ? @JvmOverloads
? ? fun showPromptDialog(title: String = "提示") {
? ? }
}在java中調(diào)用
DialogUtils.showPromptDialog();
DialogUtils.showPromptDialog("標(biāo)題");到此這篇關(guān)于Java與Kotlin互調(diào)原理的文章就介紹到這了,更多相關(guān)Java與Kotlin互調(diào)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot整合RabbitMQ實(shí)現(xiàn)延遲隊(duì)列和死信隊(duì)列
RabbitMQ的死信隊(duì)列用于接收其他隊(duì)列中的“死信”消息,所謂“死信”,是指滿足一定條件而無(wú)法被消費(fèi)者正確處理的消息,死信隊(duì)列通常與RabbitMQ的延遲隊(duì)列一起使用,本文給大家介紹了SpringBoot整合RabbitMQ實(shí)現(xiàn)延遲隊(duì)列和死信隊(duì)列,需要的朋友可以參考下2024-06-06
IDEA2020.2.3中創(chuàng)建JavaWeb工程的完整步驟記錄
這篇文章主要給大家介紹了關(guān)于IDEA2020.2.3中創(chuàng)建JavaWeb工程的完整步驟,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
SpringBoot?實(shí)現(xiàn)動(dòng)態(tài)添加定時(shí)任務(wù)功能
這篇文章主要介紹了SpringBoot?動(dòng)態(tài)添加定時(shí)任務(wù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02
使用Spring Boot搭建Java web項(xiàng)目及開(kāi)發(fā)過(guò)程圖文詳解
這篇文章主要介紹了使用Spring Boot搭建Java web項(xiàng)目及開(kāi)發(fā)過(guò)程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06

