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

 更新时间:2021年12月12日 11:02:56   作者:Lucky_William  
Kotlin的设计过程中就考虑到了与Java的互操作性,在Kotlin中可以直接调用既有的Java代码,反过来在Java中也可以很流畅地使用Kotlin代码,这篇文章主要给大家介绍了关于Kotlin与Java相互调用的相关资料,需要的朋友可以参考下

一、Kotlin 调用 Java

1. kotlin 关键字转义

java 中的方法或变量 是 kotlin 的关键字时,使用反引号 `` 对关键字进行转义

// java
public class JavaDemo {

    String is;

    public String getIs() {
        return is;
    }

    public void setIs(String is) {
        this.is = is;
    }

    public void in() {
        System.out.println("call java method in");
    }
    
	public void multiParams(int... params) {
        System.out.println(Arrays.toString(params));
    }
}
// kotlin
fun main() {
    // 1. java 中的方法或变量 是kotlin 的关键字时,使用反引号 `` 对关键字进行转义
    val demo = JavaDemo()

    // 调用 java 的 is 属性,is 是 kotlin 的关键字,使用反引号转义
    demo.`is` = "call java field"
    println(demo.`is`) // call java field

    // 调用 java 的 in 方法,in 是 kotlin 的关键字,使用反引号转义
    demo.`in`() // call java method in
}

2. kotlin 可将数组传给 java 的可变数量参数

// kotlin
// 使用 * 号将 kotlin 的 数组 传给 java 的 可变数量参数
fun main() {
	val arrayInt = intArrayOf(1, 2, 3)
	demo.multiParams(*arrayInt) // [1, 2, 3]
}

3. kotlin 获取对象的 java 类

// kotlin
fun main() {
 	demo::class.java
    demo.javaClass
}

二、Java 调用 Kotlin

1. java 调用 kotlin 类的属性和方法

// kotlin
class KotlinDemo {
    var field: String = "kotlin field"

    fun method() {
        println("call kotlin method")
    }
}

// java
public static void main(String[] args) {
	KotlinDemo demo = new KotlinDemo();
    System.out.println(demo.getField()); // kotlin field
    demo.method(); // call kotlin method
}

2. java 调用 kotlin 的顶级属性和顶级函数

// kotlin
val topLevelField: Int
    get() {
        println("call kotlin top level field")
        return 1
    }

fun topLevelFunc() {
    println("call kotlin top level function")
}
// java
public static void main(String[] args) {
	TestCallEachOtherKt.getTopLevelField(); // call kotlin top level field
    TestCallEachOtherKt.topLevelFunc(); // call kotlin top level function
}
        

3. java 调用生成指定类名的 kotlin 属性和函数

// kotlin
// 指定文件生成的 Java 类或方法的名称。
@file:JvmName("CallKtDemo")

package com.william.testkt

var field: Int = 100

fun method() {
    println("call CallKtDemo method")
}

// java
public static void main(String[] args) {
	System.out.println(CallKtDemo.getField());
    CallKtDemo.method();
}

4. java 调用 kotlin 的伴生对象的方法和静态方法

// kotlin
class TestCallKotlin {

    companion object {
    	// 模拟静态方法
        fun method1() {
            println("call method1")
        }

		// 静态方法
        @JvmStatic 
        fun method2() {
            println("call method2")
        }
    }
}
// java
public static void main(String[] args) {
	TestCallKotlin.Companion.method1();
	TestCallKotlin.method2();
}

5. java 调用 kotlin 单例类的方法

// kotlin
object KotlinObject {

    fun method1() {
        println("call method1")
    }

    @JvmStatic
    fun method2() {
        println("call method2")
    }
}

// java
public static void main(String[] args) {
	KotlinObject.INSTANCE.method1();
    KotlinObject.method2();
}

6. java 调用 kotlin 含有 lambda 表达式参数的方法

// kotlin
object KotlinObject {

    // 参数为 lambda 表达式,入参为 Int,返回值为 Unit
    @JvmStatic
    fun method3(param: (Int) -> Unit = {}) {
        param.invoke(101)
    }

    // 参数为 lambda 表达式,入参为 Boolean,返回值为 String
    @JvmStatic
    fun method4(param: (Boolean) -> String = { "" }) {
        param.invoke(true)
    }
}

// java
public static void main(String[] args) {

	KotlinObject.method3(new Function1<Integer, Unit>() {
     	@Override
        public Unit invoke(Integer integer) {
            System.out.println(integer);
            return null;
        }
    });

    KotlinObject.method4(new Function1<Boolean, String>() {
        @Override
        public String invoke(Boolean param) {
            System.out.println("invoke param: " + param);
            return param ? "success" : "failed";
        }
    });
}

附 Github 源码:

JavaDemo.java

TestCallKotlin.kt

TestCallEachOther.kt

总结

到此这篇关于Kotlin与Java相互调用的文章就介绍到这了,更多相关Kotlin与Java相互调用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Flutter 常用插件汇总

    Flutter 常用插件汇总

    Flutter 有了谷歌强大后盾加持,加上跨平台的特性,生态日益丰富,目前大部分应用能够用到的插件在 pub.flutter-io.cn上都可以找得到。本篇介绍 Flutter 最为常见的插件,以避免重复造轮子和新手少走弯路。
    2021-05-05
  • Android中实现多线程操作的几种方式

    Android中实现多线程操作的几种方式

    多线程一直是一个老大难的问题,首先因为它难以理解,其次在实际工作中我们需要面对的关于线程安全问题也并不常见,今天就来总结一下实现多线程的几种方式,感兴趣的可以了解一下
    2021-06-06
  • Android编程实现图片平铺的方法分析

    Android编程实现图片平铺的方法分析

    这篇文章主要介绍了Android编程实现图片平铺的方法,结合具体实例形式总结分析了Android实现图片平铺效果的三种常用操作技巧,需要的朋友可以参考下
    2017-06-06
  • Android 实现彻底退出自己APP 并杀掉所有相关的进程

    Android 实现彻底退出自己APP 并杀掉所有相关的进程

    这篇文章主要介绍了Android 实现彻底退出自己APP 并杀掉所有相关的进程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • Flutter移动端进行多渠道打包发布的全过程

    Flutter移动端进行多渠道打包发布的全过程

    在使用flutter开发的过程中,需要根据不同的环境,不同的包名来打包,下面这篇文章主要给大家介绍了关于Flutter移动端进行多渠道打包发布的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • Android自定义View之酷炫数字圆环

    Android自定义View之酷炫数字圆环

    这篇文章主要为大家详细介绍了Android自定义View之酷炫数字圆环,实现效果很酷,,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-01-01
  • monkeyrunner之电脑安装驱动(5)

    monkeyrunner之电脑安装驱动(5)

    这篇文章主要为大家详细介绍了monkeyrunner之电脑安装驱动的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • Android事件的分发机制详解

    Android事件的分发机制详解

    这篇文章主要为大家详细介绍了Android事件的分发机制,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • Android反编译看看手Q口令红包的实现原理

    Android反编译看看手Q口令红包的实现原理

    这篇文章主要介绍了Android反编译看看手Q口令红包的实现原理,需要的朋友可以参考下
    2016-02-02
  • Android Handler实现闪屏页倒计时代码

    Android Handler实现闪屏页倒计时代码

    这篇文章主要介绍了Android Handler实现闪屏页倒计时代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08

最新评论