Java与Kotlin互调原理
一、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("标题");
到此这篇关于Java与Kotlin互调原理的文章就介绍到这了,更多相关Java与Kotlin互调内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!
原文出处:https://blog.51cto.com/petterp/5015287
相关文章
- 这篇文章主要介绍了如何利用java语言实现经典《复杂迷宫》游戏,文中采用了swing技术进行了界面化处理,感兴趣的小伙伴可以动手试一试...2022-02-01
java 运行报错has been compiled by a more recent version of the Java Runtime
java 运行报错has been compiled by a more recent version of the Java Runtime (class file version 54.0)...2021-04-01- 这篇文章主要介绍了在java中获取List集合中最大的日期时间操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
- 这篇文章主要介绍了教你怎么用Java获取国家法定节假日,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下...2021-04-23
- 这篇文章主要介绍了Java如何发起http请求的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-31
- 说起C#和Java这两门语言(语法,数据类型 等),个人以为,大概有90%以上的相似,甚至可以认为几乎一样。但是在工作中,我也发现了一些细微的差别...2020-06-25
- 这篇文章主要介绍了解决Java处理HTTP请求超时的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-29
- 这篇文章主要介绍了java 判断两个时间段是否重叠的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
java 画pdf用itext调整表格宽度、自定义各个列宽的方法
这篇文章主要介绍了java 画pdf用itext调整表格宽度、自定义各个列宽的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-31- 这篇文章主要介绍了超简洁java实现双色球若干注随机号码生成(实例代码),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-04-02
- 这篇文章主要介绍了Java生成随机姓名、性别和年龄的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-01
- 这篇文章主要介绍了java正则表达式判断前端参数修改表中另一个字段的值,需要的朋友可以参考下...2021-05-07
Java使用ScriptEngine动态执行代码(附Java几种动态执行代码比较)
这篇文章主要介绍了Java使用ScriptEngine动态执行代码,并且分享Java几种动态执行代码比较,需要的朋友可以参考下...2021-04-15- 这篇文章主要介绍了Java开发实现人机猜拳游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-08-03
- 这篇文章主要介绍了Java List集合返回值去掉中括号('[ ]')的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-29
Java 8 Stream 的终极技巧——Collectors 功能与操作方法详解
这篇文章主要介绍了Java 8 Stream Collectors 功能与操作方法,结合实例形式详细分析了Java 8 Stream Collectors 功能、操作方法及相关注意事项,需要的朋友可以参考下...2020-05-20Java中lombok的@Builder注解的解析与简单使用详解
这篇文章主要介绍了Java中lombok的@Builder注解的解析与简单使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-01-06- 下面小编就为大家带来一篇java中String类型变量的赋值问题介绍。小编觉得挺不错的。现在分享给大家,给大家一个参考。...2016-03-28
- 这篇文章主要介绍了Java连接数据库oracle中文乱码解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-05-16
- 这篇文章主要介绍了Java线程池中的各个参数如何合理设置操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-19