Kotlin 与 Java 互操作

1、Java 类中通过 Getter 和 Setter 方法访问 Kotlin 字段

在Java中不能直接访问 Kotlin 中的字段 , 必须调用相应的 Getter 和 Setter 方法,才能进行访问 ;

代码示例 :

Kotlin 类 : 在 Kotlin 中声明的成员属性 , 默认就是 private 私有属性 , 默认为其生成了 Getter 和 Setter 方法 ;

class Hello {
    var name = "Tom"
}

在Java类中 , 只能通过Getter和Setter方法 , 调用 Kotlin 字段 ;

public class HelloJava {
    public static void main(String[] args) {
        Hello hello = new Hello();
        System.out.println(hello.getName());
    }
}

2、Java 类中直接访问被 @JvmField 注解修饰的 Kotlin 字段

如果在 Kotlin 中 , 使用 @JvmField 注解修饰成员属性 , 其作用是将 Kotlin 字段暴露给 Java , 在 Java 中可以不使用 Getter 和 Setter 方法 而直接访问 Kotlin 字段 ;

Kotlin 代码 :

class Hello {
    @JvmField
    var name = "Tom"
}

Java 代码 :

public class HelloJava {
    public static void main(String[] args) {
        Hello hello = new Hello();
        System.out.println(hello.name);
    }
}
@JvmField 注解 相当于 将 Kotlin 中的字段声明为 Java 字段 , 此时 Kotlin 不会为该字段自动生成 Getter 和 Setter 方法 ;

3、使用@JvmOverloads注解修饰Kotlin函数

在Kotlin中使用 @JvmOverloads 注解修饰 Kotlin 函数 , 会自动为Java用户实现一系列的重载函数 ;

Kotlin 代码示例 :

class Hello {
    @JvmOverloads
    fun helloStudent(name: String = "Tom", age: Int = 18) {
        println("Student $name is $age years old , say hello !")
    }
}

fun main() {
    var hello = Hello();
    hello.helloStudent()
    hello.helloStudent("Jerry")
    hello.helloStudent(age = 22)
    hello.helloStudent("Bill", 12)
}

Java 代码示例 :

public class HelloJava {
    public static void main(String[] args) {
        Hello hello = new Hello();
        hello.helloStudent();
        hello.helloStudent("Jerry");
        hello.helloStudent("Bill", 12);
    }
}

执行结果 :

Student Tom is 18 years old , say hello !
Student Jerry is 18 years old , say hello !
Student Bill is 12 years old , say hello !

使用了 @JvmOverloads 注解后 ,在编译时自动为 helloStudent 函数 , 生成了参数的重载函数 ,这样在 Java 中调用时 , 可以直接调用这些方法。

4、使用 @JvmStatic 注解声明静态成员

在 Kotlin 中 , 没有静态成员概念 , 需要声明静态成员时 , 一般都在其 Companion 伴生对象中声明 ;

在Java中调用 Kotlin 的 Companion 伴生对象中的成员时 , 需要通过如下形式进行调用 :

Kotlin类.Companion.成员属性
Kotlin类.Companion.成员函数

如果想要在不使用Companion的前提下,直接调用Kotlin中的 Companion 伴生对象成员,可以在 companion object中 ,使用 @JvmStatic 注解将伴生对象中的成员声明为 Java 静态成员 ,Java中可以按照静态成员的方式进行访问 ;

Kotlin 代码 :

class Hello {
    companion object {
        @JvmStatic
        var name = "Tom"

        @JvmStatic
        fun say() {
            println("Hello World")
        }
    }
}

Java 代码 :

public class HelloJava {
    public static void main(String[] args) {
        System.out.println(Hello.getName());
        Hello.say();
    }
}

执行结果 :

查看该 Kotlin 类生成的字节码 反编译 的 Java 代码 :

import kotlin.Metadata;
import kotlin.jvm.JvmStatic;
import kotlin.jvm.internal.DefaultConstructorMarker;
import kotlin.jvm.internal.Intrinsics;
import org.jetbrains.annotations.NotNull;

@Metadata(
   mv = {1, 1, 16},
   bv = {1, 0, 3},
   k = 1,
   d1 = {"\u0000\f\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0003\u0018\u0000 \u00032\u00020\u0001:\u0001\u0003B\u0005¢\u0006\u0002\u0010\u0002¨\u0006\u0004"},
   d2 = {"LHello;", "", "()V", "Companion", "KotlinDemo"}
)
public final class Hello {
   @NotNull
   private static String name = "Tom";
   public static final Hello.Companion Companion = new Hello.Companion((DefaultConstructorMarker)null);

   @NotNull
   public static final String getName() {
      Hello.Companion var10000 = Companion;
      return name;
   }

   public static final void setName(@NotNull String var0) {
      Hello.Companion var10000 = Companion;
      name = var0;
   }

   @JvmStatic
   public static final void say() {
      Companion.say();
   }

   @Metadata(
      mv = {1, 1, 16},
      bv = {1, 0, 3},
      k = 1,
      d1 = {"\u0000\u001a\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0010\u000e\n\u0002\b\u0006\n\u0002\u0010\u0002\n\u0000\b\u0086\u0003\u0018\u00002\u00020\u0001B\u0007\b\u0002¢\u0006\u0002\u0010\u0002J\b\u0010\n\u001a\u00020\u000bH\u0007R$\u0010\u0003\u001a\u00020\u00048\u0006@\u0006X\u0087\u000e¢\u0006\u0014\n\u0000\u0012\u0004\b\u0005\u0010\u0002\u001a\u0004\b\u0006\u0010\u0007\"\u0004\b\b\u0010\t¨\u0006\f"},
      d2 = {"LHello$Companion;", "", "()V", "name", "", "name$annotations", "getName", "()Ljava/lang/String;", "setName", "(Ljava/lang/String;)V", "say", "", "KotlinDemo"}
   )
   public static final class Companion {
      /** @deprecated */
      // $FF: synthetic method
      @JvmStatic
      public static void name$annotations() {
      }

      @NotNull
      public final String getName() {
         return Hello.name;
      }

      public final void setName(@NotNull String var1) {
         Intrinsics.checkParameterIsNotNull(var1, "<set-?>");
         Hello.name = var1;
      }

      @JvmStatic
      public final void say() {
         String var1 = "Hello World";
         boolean var2 = false;
         System.out.println(var1);
      }

      private Companion() {
      }

      // $FF: synthetic method
      public Companion(DefaultConstructorMarker $constructor_marker) {
         this();
      }
   }
}

在Kotlin类编译时 , 自动生成了

  • Hello.name 静态成员 以及 其 静态的 Getter 和 Setter 方法 ,

  • Hello.say 静态方法 ;

这两个静态成员都是 Kotlin 类中的 Hello.Companion 伴生对象中的成员 , 但是编译时生成在了 Hello 类中 , 称为了 Hello 类的成员。

public final class Hello {
   @NotNull
   private static String name = "Tom";

   @NotNull
   public static final String getName() {
      Hello.Companion var10000 = Companion;
      return name;
   }

   public static final void setName(@NotNull String var0) {
      Hello.Companion var10000 = Companion;
      name = var0;
   }

   @JvmStatic
   public static final void say() {
      Companion.say();
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值