• kotlin(十七)Kotlin和Java相互调用


    1.Kotlin调用Java的方法和属性

     1)定义java类

    1. public class JavaClass {
    2. private String javaString = "java";
    3. public void sayHello(String name) {
    4. System.out.println("Hello " + name);
    5. }
    6. public String getJavaString() {
    7. return javaString;
    8. }
    9. }

    Kotlin调用Java.由于Java中可以定义null,所以在kotlin中要做可空性判断,避免发生空指针异常

    1. fun main() {
    2. val java = JavaClass()
    3. java.sayHello("Java")
    4. println(java.javaString)
    5. //由于Java中可以定义null,所以在kotlin中要做可空性判断,避免发生空指针异常
    6. val javaString:String? = java.javaString
    7. javaString?.uppercase()
    8. }

    2)定义kotlin类

    1. class KotlinClass {
    2. val kotlinString="Kotlin"
    3. fun sayHello(name: String) {
    4. println("Hello $name")
    5. }
    6. }

    Java中调用Kotlin中的属性和方法

    1. public static void main(String[] args) {
    2. KotlinClass kotlin = new KotlinClass();
    3. kotlin.sayHello("Kotlin");
    4. String kotlinString = kotlin.getKotlinString();
    5. System.out.println(kotlinString);
    6. }

    Java中访问Kotlin中的属性,必须通过getter setter方法。如果想直接访问,得需要在kotlin中定义的属性加上。

    1. class KotlinClass {
    2. @JvmField
    3. val kotlinString="Kotlin"
    4. }
    5. public static void main(String[] args) {
    6. KotlinClass kotlin = new KotlinClass();
    7. String kotlinString = kotlin.kotlinString;
    8. System.out.println(kotlinString);
    9. }

    2.当定义的kotlin函数参数有默认值时,@JvmOverloads 可以使kotlin编译器生产重载方法。

    1. class KotlinClass {
    2. @JvmOverloads
    3. fun sayHello(name: String = "kotlin") {
    4. println("Hello $name")
    5. }
    6. }
    7. public static void main(String[] args) {
    8. KotlinClass kotlin = new KotlinClass();
    9. kotlin.sayHello();
    10. kotlin.sayHello("Kotlin");
    11. }

    看一下kotlin通过编译器生成的重载方法

    1. public final class KotlinClass {
    2. @JvmOverloads
    3. public final void sayHello(@NotNull String name) {
    4. Intrinsics.checkNotNullParameter(name, "name");
    5. String var2 = "Hello " + name;
    6. System.out.println(var2);
    7. }
    8. // $FF: synthetic method
    9. public static void sayHello$default(KotlinClass var0, String var1, int var2, Object var3) {
    10. if ((var2 & 1) != 0) {
    11. var1 = "kotlin";
    12. }
    13. var0.sayHello(var1);
    14. }
    15. @JvmOverloads
    16. public final void sayHello() {
    17. sayHello$default(this, (String)null, 1, (Object)null);
    18. }
    19. }

    3.Java访问Kotlin中的伴生对象属性和方法。

    1. class KotlinClass {
    2. companion object {
    3. val HELLO_WORLD = "hello world"
    4. fun sayHello() = println(HELLO_WORLD)
    5. }
    6. }
    7. public static void main(String[] args) {
    8. KotlinClass.Companion.getHELLO_WORLD();
    9. KotlinClass.Companion.sayHello();
    10. }

    @JvmField 可以以静态的方法来访问伴生对象中定义的属性。

    @JvmStatic定义在函数上,可以直接调用伴生对象中的函数。

    1. class KotlinClass {
    2. companion object {
    3. @JvmField
    4. val HELLO_WORLD = "hello world"
    5. @JvmStatic
    6. fun sayHello() = println(HELLO_WORLD)
    7. }
    8. }
    9. public static void main(String[] args) {
    10. // KotlinClass.Companion.getHELLO_WORLD();
    11. // KotlinClass.Companion.sayHello();
    12. String hello = KotlinClass.HELLO_WORLD;
    13. KotlinClass.sayHello();
    14. }

    4.异常处理。

     1)Kotlin捕获Java中的异常

         java中抛出的异常,在java中调用时,编译器会自动提示要捕获异常。

        但是在Kotlin中调用时,不捕获异常也会编译通过

    1. public class JavaClass {
    2. public void testException() throws IOException {
    3. System.out.println("exception");
    4. }
    5. public static void main(String[] args) {
    6. try {
    7. new JavaClass().testException();
    8. } catch (IOException e) {
    9. e.printStackTrace();
    10. }
    11. }
    12. }
    13. Kotlin中调用java代码
    14. fun main() {
    15. val java = JavaClass()
    16. java.testException();
    17. }

    2)在Kotlin中抛出的异常,必须加上Throws注解,在java中才会自动提示捕获异常。

          @Throws(IOException::class) 

    1. class KotlinClass {
    2. @Throws(IOException::class)
    3. fun testException(){
    4. throw IOException()
    5. }
    6. }
    7. public class JavaClass {
    8. public void testException() throws IOException {
    9. System.out.println("exception");
    10. }
    11. public static void main(String[] args) {
    12. KotlinClass kotlin = new KotlinClass();
    13. try {
    14. kotlin.testException();
    15. } catch (IOException e) {
    16. e.printStackTrace();
    17. }
    18. }
    19. }

    5.Java中调用Kotlin中定义的匿名函数

     在kotlin中定义两个匿名函数,一个是一个参数,一个是两个参数。

    1. class KotlinClass {
    2. val sayHello = { name:String ->
    3. println("Hello $name")
    4. }
    5. val sayHello2 = { name:String,name2:String ->
    6. println("Hello $name and $name2")
    7. }
    8. }

    在java中调用Kotlin中的匿名函数。通过Function1 invoke,可以调用一个参数的匿名函数,

    通过Function2.invoke可以调用两个参数的匿名函数,一次类推可以从Function0--Function22.

    Function0代表无参的匿名函数,Function22最多可以接收22个参数。

    1. public static void main(String[] args) {
    2. KotlinClass kotlin = new KotlinClass();
    3. Function1 function1 = kotlin.getSayHello();
    4. function1.invoke("HanMei");
    5. Function2 function2 = kotlin.getSayHello2();
    6. function2.invoke("HanMei","LiLei");
    7. }

  • 相关阅读:
    微信小程序业务域名保姆级配置教程
    java毕业设计的滑雪场学具租赁管理系统mybatis+源码+调试部署+系统+数据库+lw
    网络编程——基础知识
    tomcat的安全配置:
    解决跨越的几种方式
    Git 的安装和配置
    HarmonyOS 习题(二)
    两数之和-(哈希)
    Mac下iterm2远程linux无法使用rz并提示waiting to receive.**B0100000023be50
    大模型时代,如何找准AI发展新方向?TVP读书会与你共探
  • 原文地址:https://blog.csdn.net/niuyongzhi/article/details/126714394