Java与Kotlin互调原理讲解

目录
  • 一、Kt调用-Java参数非null的处理
    • @NotNull
    • Kotlin中调用
  • 二、Kt调用-Java中使用kt关键字声明的变量和方法
    • Kotlin中调用
  • 三、Kt调用Java-SAM转换
    • 在Kotlin中调用
  • 四、Kt中禁止Java调用某方法
    • @JvmSynthetic
  • 五、Java调用Kt-扩展函数
    • @file:JvmName(“xx”)
  • 六、Java调用kt-成员变量
    • @JvmField
    • Kotlin
    • @get:JvmName,@set:JvmName
    • Kotlin
  • 七、Java调用Kt-伴生对象
    • @JvmStatic
    • Kotlin
  • 八、Java调用Kt-方法默认参数值
    • @JvmOverloads
    • kotlin
    • 在java中调用

一、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互调内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • kotlin和Java的相互调用示例详解

    前言 互操作就是在Kotlin中可以调用其他编程语言的接口,只要它们开放了接口,Kotlin就可以调用其成员属性和成员方法,这是其他编程语言所无法比拟的.同时,在进行Java编程时也可以调用Kotlin中的API接口. 1.在kotlin中调用Java方法 Kotlin和Java是两种不同的语言,所以在互相调用的时候,会有一些特殊的语法.kotlin中对象属性默认就带有setter和getter方法,所以在kotlin中调用Java时直接变量名点属性就可获取到属性的setter和getter的一

  • Kotlin与Java相互调用的完整实例

    目录 一.Kotlin 调用 Java 二.Java 调用 Kotlin 附 Github 源码: 总结 一.Kotlin 调用 Java 1. kotlin 关键字转义 java 中的方法或变量 是 kotlin 的关键字时,使用反引号 `` 对关键字进行转义 // java public class JavaDemo { String is; public String getIs() { return is; } public void setIs(String is) { this.is

  • Java与Kotlin互调原理讲解

    目录 一.Kt调用-Java参数非null的处理 @NotNull Kotlin中调用 二.Kt调用-Java中使用kt关键字声明的变量和方法 Kotlin中调用 三.Kt调用Java-SAM转换 在Kotlin中调用 四.Kt中禁止Java调用某方法 @JvmSynthetic 五.Java调用Kt-扩展函数 @file:JvmName(“xx”) 六.Java调用kt-成员变量 @JvmField Kotlin @get:JvmName,@set:JvmName Kotlin 七.Java调

  • Java与Kotlin互调原理

    目录 一.Kt调用-Java参数非null的处理 @NotNull Kotlin中调用 二.Kt调用-Java中使用kt关键字声明的变量和方法 Kotlin中调用 三.Kt调用Java-SAM转换 在Kotlin中调用 四.Kt中禁止Java调用某方法 @JvmSynthetic 五.Java调用Kt-扩展函数 @file:JvmName(“xx”) 六.Java调用kt-成员变量 @JvmField Kotlin @get:JvmName,@set:JvmName Kotlin 七.Java调

  • java中Base64编码原理实例讲解

    什么是 Base64 编码 Base64 编码是最常见的编码方式,基于 64 个可打印字符来表示任意二进制数据的方法,是从二进制转换到可见字符的过程. 使用场景 数据加密或签名通过 Base64 转换为字符串存储或传输. 不能传输文件的网络环境可以转换 Base64 进行网络传输. 在文本资源(如 HTML 和 CSS文件)中嵌入图片文件或其他二进制资源. 在 URL.网页中传输少量二进制数据等等. Base64 编码原理 原理是把每 3 个字节(每个字节为 8 位, 3 个字节为 24 位)重

  • Java中的Kotlin 内部类原理

    目录 Java 中的内部类 OutterJava.class InnJava.class Kotlin 中的内部类 总结 Java 中的内部类 这是一个 Java 内部类的简单实现: public class OutterJava {    private void printOut() {        System.out.println("AAA");   } ​    class InnJava {        public void printInn() {        

  • 在Java与Kotlin之间如何进行互操作详解

    前言 目前kotlin是谷歌首推的开发Android的语言,但由于历史原因,我们绝大部分项目依旧还是以Java为主的,也就是说存在Java和Kotlin两种语言同时开发的情况. 有人会说把老项目全部翻译成Kotlin,的确可以怎么做,但是成本还是挺大的.我们只能一点一点慢慢的向kotlin语言迁移. 那么在迁移的过程中就避免不了Java和Kotlin相互调用的情况.即Kotlin调用Java或者Java调用Kotlin.下面我们就来具体看下两者之间相互操作的一些解决方案. kotlin调用jav

  • Java集合 LinkedList的原理及使用详解

    LinkedList和ArrayList一样是集合List的实现类,虽然较之ArrayList,其使用场景并不多,但同样有用到的时候,那么接下来,我们来认识一下它. 一. 定义一个LinkedList public static void main(String[] args) { List<String> stringList = new LinkedList<>(); List<String> tempList = new ArrayList<>();

  • 深入理解 Java、Kotlin、Go 的线程和协程

    前言 Go 语言比 Java 语言性能优越的一个原因,就是轻量级线程Goroutines(协程Coroutine).本篇文章深入分析下 Java 的线程和 Go 的协程. 协程是什么 协程并不是 Go 提出来的新概念,其他的一些编程语言,例如:Go.Python 等都可以在语言层面上实现协程,甚至是 Java,也可以通过使用扩展库来间接地支持协程. 当在网上搜索协程时,我们会看到: Kotlin 官方文档说「本质上,协程是轻量级的线程」. 很多博客提到「不需要从用户态切换到内核态」.「是协作式的

  • Java设计模式之GOF23全面讲解

    一.什么是设计模式 设计模式(Design pattern) 是解决软件开发某些特定问题而提出的一些解决方案也可以理解成解决问题的一些思路.通过设计模式可以帮助我们增强代码的可重用性.可扩充性. 可维护性.灵活性好.我们使用设计模式最终的目的是实现代码的高内聚和低耦合. 二.设计模式的三大分类及关键点 1.创建型模式 对象实例化的模式,创建型模式用于解耦对象的实例化过程. 单例模式:某个类智能有一个实例,提供一个全局的访问点.工厂模式:一个工厂类根据传入的参量决定创建出哪一种产品类的实例.抽象工

  • Java面向对象之内部类案例讲解

    1. 内部类 很多时候我们创建类的对象的时候并不需要使用很多次,每次只使用一次,这个时候我们就可以使用内部类了 1.1 内部类概述 内部类就是在一个类的内部在定义一个类,比如,A类中定义一个B类,那么B类相对A类来说就称为内部类,而A类相对B类来说就是外部类了. 内部类不是在一个java源文件中编写俩个平行的俩个类,而是在一个类的内部再定义另外一个类. 我可以把外边的类称为外部类,在其内部编写的类称为内部类. 内部类分为四种: 成员内部类 静态内部类 局部内部类 匿名内部类 1.2 成员内部类(

  • Java之springcloud Sentinel案例讲解

    一.Sentinel是什么? Sentinel (分布式系统的流量防卫兵) 是阿里开源的一套用于服务容错的综合性解决方案. 它以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度来保护服务的稳定性. 二.使用步骤 1.下载地址 下载地址:https://github.com/alibaba/Sentinel/releases java -jar sentinel-dashboard-1.7.0.jar 访问:http://localhost:8080 用户名密码:sentinel/sen

随机推荐