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


猜你喜欢
- 本文实例讲述了Android获取手机系统版本等信息的方法。分享给大家供大家参考。具体如下:String phoneInfo = "
- 本文实例讲述了C#中Memcached缓存的用法,分享给大家供大家参考。具体方法如下:ICacheStrategy.cs文件如下:publi
- 详解Kotlin中的面向对象(二)在Kotlin中的面向对象(一)中,介绍了Kotlin类的相关操作,本文将在上文的基础上,继续介绍属性、接
- 这两天看阿里的JAVA开发手册,到多线程的时候说永远不要用 new Thread()这种方式来使用多线程。确实是这样的,我一直在用线程池,到
- 从源代码树下载下来的最新Android源代码,是不包括内核代码的,也就是Android源代码工程默认不包含Linux Kernel代码,而是
- 记得在 MS Build 2020 大会上,C# 语言开发项目经理 Mads Torgersen 宣称 C# 9.0 将会随着 .NET 5
- 本文实例总结了C#中WinForm程序退出方法技巧。分享给大家供大家参考。具体分析如下:在c#中退出WinForm程序包括有很多方法,如:t
- 概述: 当希望能直接在数据库语言中只检索符合条件的记录,不需要再通过程序对其做处理时,SQL语句分页
- WPF的ImageBrush是一个比较常见也比较复杂的笔刷,它继承自图块笔刷(TileBrush)。使用图块画笔绘制区域涉及以下三个组成部分
- INotifyPropertyChanged:该接口包含一个事件, 针对属性发生变更时, 执行该事件发生。// /
- 写了一个过滤器,根据需要限制edittext输入的整数和小数位,如下代码:package allone.verbank.apad.clien
- 背景:在Android中按照数据保存的方式,可以分为如下几种Content Provider (用的SQLite实现),SQLite,Sha
- 在日常Android手机的使用过程中,根据电话号码获得联系人头像,是经常会碰到的问题。本文即以实例形式讲述了Android根据电话号码获得联
- 在Java项目开发中,Maven是非常重要的构建工具之一,它可以帮助我们管理项目的依赖、构建和发布。本文将通过以下两个方面来介绍Maven打
- Android 消息分发使用EventBus的实例详解1. AndroidStudio使用dependencies {//最新版本 &nbs
- MyBatis 是一款常用的持久层框架,使得程序能够以调用方法的方式执行某个指定的SQL,将执行SQL的底层逻辑进行封装。多数与Spring
- 通常,反射用于动态获取对象的类型、属性和方法等信息。今天带你玩转反射,来汇总一下反射的各种常见操作,捡漏看看有没有你不知道的。获取类型的成员
- multipartResolver上传文件配置1、gradle配置 compile ('commons-i
- 匿名内部类:先举个例子吧,给大家看一下什么是匿名内部类,Endeavor刚刚接触的时候,觉得哇哦,好奇怪的样子,这也太别扭了吧,不知道大家是
- 前言Guava是google公司开发的一款Java类库扩展工具包,内含了丰富的API,涵盖了集合、缓存、并发、I/O等多个方面。使用这些AP