Kotlin实战指南十七:JvmField、JvmStatic使用

转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/116668666
本文出自【赵彦军的博客】

往期精彩文章

Kotlin实战指南十六:Synchronized、Volatile
Kotlin实战指南十五:协程泄漏
Kotlin实战指南十四:协程启动模式

@JvmField

JvmField 是针对kotlin 字段来说的,有两重意思:

  • 消除了变量的getter与setter方法
  • 把变量用 public 暴露出来
class Util {
    val age = 1
}

转换成 java 类

public final class Util {
   private final int age = 1;

   public final int getAge() {
      return this.age;
   }
}

可以看到,a1 是私有的,并且对外暴露了 getAge 方法,如果 agevar 类型,还会暴露 setAge 方法。

下面我们加上 JvmField 注解后,再看看

class Util {

    @JvmField
    var age = 1

}

转成 java 文件

public final class Util {
   @JvmField
   public int age = 1;
}

通过前后对比,我们可以得出结论

  • JvmField 注解可以消除 get / set 方法
  • JvmField 注解是的属性以 public 的形式对外暴露

@JvmStatic

只能在object类或者伴生对象companion object中使用,而@JvmField没有这些限制

JvmStatic 作用:

  • 只能在object类或者伴生对象companion object中使用
  • 作用于属性时,会把 get / set方法变成静态的
  • 作用于方法时,会把该方法变成静态的
object Util {

    var age = 1

    fun run() {

    }

}

转成 java

public final class Util {
   private static int age;
   @NotNull
   public static final Util INSTANCE;

   public final int getAge() {
      return age;
   }

   public final void setAge(int var1) {
      age = var1;
   }

   public final void run() {
   }

   private Util() {
   }

   static {
      Util var0 = new Util();
      INSTANCE = var0;
      age = 1;
   }
}

加上 JvmStatic 后再观察

object Util {

    @JvmStatic
    var age = 1

    @JvmStatic
    fun run() {

    }
}

转换成 java 后

public final class Util {
   private static int age;
   @NotNull
   public static final Util INSTANCE;

   /** @deprecated */
   // $FF: synthetic method
   @JvmStatic
   public static void age$annotations() {
   }

   public static final int getAge() {
      return age;
   }

   public static final void setAge(int var0) {
      age = var0;
   }

   @JvmStatic
   public static final void run() {
   }

   private Util() {
   }

   static {
      Util var0 = new Util();
      INSTANCE = var0;
      age = 1;
   }
}

JvmStatic 作用于伴生对象

  • 作用于属性时,会在伴生对象外面额外生成静态 set / get 方法
  • 作用于方法时,会在伴生对象外面额外生成静态方法
class Util {

    companion object {
        var age = 1
        fun run() {
            
        }
    }
}

转成 java 后

public final class Util {
   private static int age = 1;
   @NotNull
   public static final Util.Companion Companion = new Util.Companion((DefaultConstructorMarker)null);

   public static final class Companion {
      public final int getAge() {
         return Util.age;
      }

      public final void setAge(int var1) {
         Util.age = var1;
      }

      public final void run() {
      }

      private Companion() {
      }

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

加上 JvmStatic 后,我们再观察

class Util {

    companion object {
        @JvmStatic
        var age = 1
        
        @JvmStatic
        fun run() {

        }
    }

}

转成 java 后

public final class Util {
   private static int age = 1;
   @NotNull
   public static final Util.Companion Companion = new Util.Companion((DefaultConstructorMarker)null);

   public static final int getAge() {
      Util.Companion var10000 = Companion;
      return age;
   }

   public static final void setAge(int var0) {
      Util.Companion var10000 = Companion;
      age = var0;
   }

   @JvmStatic
   public static final void run() {
      Companion.run();
   }
   
   public static final class Companion {
      /** @deprecated */
      // $FF: synthetic method
      @JvmStatic
      public static void age$annotations() {
      }

      public final int getAge() {
         return Util.age;
      }

      public final void setAge(int var1) {
         Util.age = var1;
      }

      @JvmStatic
      public final void run() {
      }

      private Companion() {
      }

      // $FF: synthetic method
      public Companion(DefaultConstructorMarker $constructor_marker) {
         this();
      }
   }
}
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值