当前位置:   article > 正文

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

kotlin 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
}
  • 1
  • 2
  • 3

转换成 java 类

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

   public final int getAge() {
      return this.age;
   }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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

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

class Util {

    @JvmField
    var age = 1

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

转成 java 文件

public final class Util {
   @JvmField
   public int age = 1;
}
  • 1
  • 2
  • 3
  • 4

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

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

@JvmStatic

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

JvmStatic 作用:

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

    var age = 1

    fun run() {

    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

转成 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;
   }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

加上 JvmStatic 后再观察

object Util {

    @JvmStatic
    var age = 1

    @JvmStatic
    fun run() {

    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

转换成 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;
   }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

JvmStatic 作用于伴生对象

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

    companion object {
        var age = 1
        fun run() {
            
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

转成 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();
      }
   }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

加上 JvmStatic 后,我们再观察

class Util {

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

        }
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

转成 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();
      }
   }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/992458
推荐阅读
相关标签
  

闽ICP备14008679号