阅读 217

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

Kotlin的设计过程中就考虑到了与Java的互操作性,在Kotlin中可以直接调用既有的Java代码,反过来在Java中也可以很流畅地使用Kotlin代码,这篇文章主要给大家介绍了关于Kotlin与Java相互调用的相关资料,需要的朋友可以参考下

目录
  • 一、Kotlin 调用 Java

  • 二、Java 调用 Kotlin

  • 附 Github 源码:

  • 总结

一、Kotlin 调用 Java

1. kotlin 关键字转义

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 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));
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
// 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 的可变数量参数

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

3. kotlin 获取对象的 java 类

1
2
3
4
5
// kotlin
fun main() {
    demo::class.java
    demo.javaClass
}

二、Java 调用 Kotlin

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

1
2
3
4
5
6
7
8
// kotlin
class KotlinDemo {
    var field: String = "kotlin field"
 
    fun method() {
        println("call kotlin method")
    }
}
1
2
3
4
5
6
// 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 的顶级属性和顶级函数

1
2
3
4
5
6
7
8
9
10
// kotlin
val topLevelField: Int
    get() {
        println("call kotlin top level field")
        return 1
    }
 
fun topLevelFunc() {
    println("call kotlin top level function")
}
1
2
3
4
5
6
// java
public static void main(String[] args) {
    TestCallEachOtherKt.getTopLevelField(); // call kotlin top level field
    TestCallEachOtherKt.topLevelFunc(); // call kotlin top level function
}
        

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

1
2
3
4
5
6
7
8
9
10
11
// kotlin
// 指定文件生成的 Java 类或方法的名称。
@file:JvmName("CallKtDemo")
 
package com.william.testkt
 
var field: Int = 100
 
fun method() {
    println("call CallKtDemo method")
}
1
2
3
4
5
// java
public static void main(String[] args) {
    System.out.println(CallKtDemo.getField());
    CallKtDemo.method();
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// kotlin
class TestCallKotlin {
 
    companion object {
        // 模拟静态方法
        fun method1() {
            println("call method1")
        }
 
        // 静态方法
        @JvmStatic
        fun method2() {
            println("call method2")
        }
    }
}
1
2
3
4
5
// java
public static void main(String[] args) {
    TestCallKotlin.Companion.method1();
    TestCallKotlin.method2();
}

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

1
2
3
4
5
6
7
8
9
10
11
12
// kotlin
object KotlinObject {
 
    fun method1() {
        println("call method1")
    }
 
    @JvmStatic
    fun method2() {
        println("call method2")
    }
}
1
2
3
4
5
// java
public static void main(String[] args) {
    KotlinObject.INSTANCE.method1();
    KotlinObject.method2();
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 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)
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 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相互调用的文章就介绍到这了

原文链接:https://blog.csdn.net/java_android_man/article/details/121879077

伪原创工具 SEO网站优化  https://www.237it.com/ 


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐