Java与Kotlin互调原理讲解

作者:Petterpx 时间:2023-08-19 00:07:41 

一、Kt调用-Java参数非null的处理

@NotNull

class TestJava {
    public void toNotNull(@NotNull String title) {}

    public void toNull(String title){}
}

Kotlin中调用

Java与Kotlin互调原理讲解

二、Kt调用- Java中使用kt关键字声明的变量和方法

kotlin中调用java方法,参数时,如果含有Kotlin关键字,必须增加 反引号 ``

public Object object;
//使用kotlin中关键字命名的方法
public void is() {

}

Kotlin中调用

 testJava.`is`()
 testJava.`object`

三、Kt调用Java-SAM转换

在Kotlin中调用带有接口参数的方法时,如果这个接口只有一个方法,那么就可以通过 lambda 表达式实现 SAM转换,从而简化我们的代码。

示例如下:

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中调用

fun main() {
    val sam = TestJavaSam()
    sam.singleFun {

    }
    sam.noParameter({
            //如果更改一下java方法参数的顺序,那么就会更简洁,如下
    },123)
    sam.noParameterClean(123){

    }
}

四、Kt中禁止Java调用某方法

@JvmSynthetic

Kotlin中,有些方法并不想暴露给Java调用,这时就可以增加这个注解在方法上。

@JvmSynthetic
fun toMain() {

}

此时toMain() 在Java中将无法调用到。

五、Java调用Kt-扩展函数

@file:JvmName(“xx”)

在java中使用Kotlin的扩展函数时,我们都会使用相应的类名+Kt 去调用相关的方法,有时候我们想自定义相应的工具类,就显得稍显麻烦,如下:

比如我们有一个顶级扩展函数,位于 UiExpand.kt 中:

fun Int.px() {}

**Java中调用 **

  //Java调用kotlin类-(UiExpand)-Int.px() 扩展方法
  UiExpandKt.px(20);

如上所示,在Java中调用时,我们必须已文件名+kt后缀才可以调用。

通过给 UiExpand.kt 包名上增加 @file:JvmName(“Ui”),我们就可以实现自定义生成的类名去调用

如下:

Ui.px()

六、Java调用kt-成员变量

@JvmField

在Java中,我们去调用Kotlin 的 成员变量 时,编译器都会帮我们自动生成相应的 get,set方法,这很符合Java Bean的写法,但是有些是有我们只是想直接去调用,这个时候就可以这样去做。

Kotlin

data class TestKotlinBean(
  @JvmField val message: String, 
  @JvmField val title: String)

**Java中调用 **

 TestKotlinBean testKotlinBean = new TestKotlinBean("","");
 String message = testKotlinBean.message;
 String title = testKotlinBean.title;

当然对于 如下的示例,就算不用增加上面的注解,在java也都是可以直接调用,免除get,set

lateinit var sum: String

object UserPicCache{
        const val KEY_CACHE = "CACHE"
 }

@get:JvmName,@set:JvmName

有些时候,我们只是想让其生成其中的一个set或者get方法,这个时候就可以使用上述注解。

Kotlin

data class TestKotlinBean(
    @set:JvmName("setMessage")
    var message: String,
    @get:JvmName("getTitle")
    val title: String
)

Java中调用:

 TestKotlinBean testKotlinBean = new TestKotlinBean("", "");
 testKotlinBean.setMessage("message");
 testKotlinBean.getTitle();

七、Java调用Kt-伴生对象

@JvmStatic

当我们在Java中调用 Kotlin 伴生对象的方法或者变量时,必须通过 类名.Companion.xx 的方式才可以调用。这时候,我们就可以增加

@JvmStatic 来直接调用。

Kotlin

class Log {
    companion object {
        var time: String = ""
        fun toLog() {
        }
    }
}

在Java中调用:

 ToLog.toLog();
 ToLog.getTime();

不过需要注意的是,@JvmStatic 对性能没有任何提升,因为相应的,编译器又生成了一个静态方法,对于可变变量,会生成两个静态方法set,get。

Java与Kotlin互调原理讲解

八、Java调用Kt-方法默认参数值

@JvmOverloads

在Kotlin中,对于方法参数,我们可能会加入一些默认值,便于更好的使用,但是在Java中,如果调用时不传递相应的方法参数,就会提示报错,这种使用就可以使用@JvmOverloads 修饰方法。

kotlin

object DialogUtils {
    @JvmStatic
    @JvmOverloads
    fun showPromptDialog(title: String = "提示") {
    }
}

在java中调用

DialogUtils.showPromptDialog();
DialogUtils.showPromptDialog("标题");

来源:https://blog.51cto.com/petterp/5015287

标签:Java,Kotlin,互调
0
投稿

猜你喜欢

  • ReactNative Alert详解及实例代码

    2022-07-04 15:02:46
  • Android简单获取经纬度的方法

    2021-07-28 05:26:47
  • C# WebApi 接口返回值不困惑:返回值类型详解

    2022-05-06 13:16:35
  • Java+TestNG接口自动化入门详解

    2023-11-05 04:37:58
  • Java基于递归和循环两种方式实现未知维度集合的笛卡尔积算法示例

    2021-07-19 04:41:18
  • C#实现为类和函数代码自动添加版权注释信息的方法

    2021-11-30 10:05:21
  • 关于Java中BeanMap进行对象与Map的相互转换问题

    2023-09-18 07:25:36
  • WinForm实现为TextBox设置水印文字功能

    2023-06-09 21:15:38
  • Java TreeSet实现学生按年龄大小和姓名排序的方法示例

    2023-01-09 15:25:18
  • Java 中Timer和TimerTask 定时器和定时任务使用的例子

    2022-04-21 17:50:27
  • My eclipse 端口占用(9360)问题解决办法

    2023-05-19 02:34:32
  • 详解java 客户端链接不上redis解决方案

    2023-11-12 10:12:15
  • SpringBoot集成SpringSecurity和JWT做登陆鉴权的实现

    2023-01-29 09:34:57
  • 运行java的class文件方法详解

    2021-07-29 03:53:48
  • 详解SpringMVC中的异常处理

    2022-10-22 07:05:14
  • c#中CAD文件读取实例

    2023-07-23 19:37:59
  • Eclipse转Itellij IDEA导入Git/svn本地项目的详细步骤

    2021-11-06 12:57:10
  • Android可自定义神奇动效的卡片切换视图实例

    2022-11-24 09:07:46
  • java分页工具类的使用方法

    2023-08-17 02:00:14
  • C# memcached缓存使用实例代码

    2022-01-15 02:17:11
  • asp之家 软件编程 m.aspxhome.com