kotlin - 为什么 JvmStatic 方法可以访问和修改状态?

标签 kotlin static-methods

我会假设一个用 @JvmStatic 注释的方法将无法访问,更不用说修改,类属性。

基于以下情况,情况并非如此。此代码清楚地更新状态,打印 From main - 11 .

object Foo {
    var bar = 5

    @JvmStatic
    fun updateBar(updateVal : Int) {
        println("bar = $bar")
        bar += updateVal
        println("bar = $bar")
    }
}

fun main() {
    Foo.updateBar(6)
    println("From main - ${Foo.bar}")
}

最佳答案

我也对此感到惊讶。其实是因为Fooobject ,领域bar实际上是JVM上的一个静态字段。
这就是为什么从静态方法访问它不是问题的原因。

你的类的反编译Java代码如下:

public final class Foo {
   private static int bar;
   public static final Foo INSTANCE;

   public final int getBar() {
      return bar;
   }

   public final void setBar(int var1) {
      bar = var1;
   }

   @JvmStatic
   public static final void updateBar(int updateVal) {
      String var1 = "bar = " + bar;
      boolean var2 = false;
      System.out.println(var1);
      bar += updateVal;
      var1 = "bar = " + bar;
      var2 = false;
      System.out.println(var1);
   }

   private Foo() {
   }

   static {
      Foo var0 = new Foo();
      INSTANCE = var0;
      bar = 5;
   }
}


但是,我会避免这样做。这是出乎意料的,并没有真正传达意图。

关于kotlin - 为什么 JvmStatic 方法可以访问和修改状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61700752/

相关文章:

kotlin - 如何将 `when` 与 2 个密封类一起使用并获取内部值?

Java Pattern 类没有公共(public)构造函数,为什么?

c++ - 类中的静态函数和数组

constructor - Dart 工厂(构造函数)与静态方法;例如,为什么 int.parse() 不是工厂构造函数?

generics - 扩展函数内的 Kotlin KClass 实例

kotlin - 如何扩展 Kotlin Number 类或使用泛型创建一个简单的属性 getter,它将对所有 Number 子类进行操作?

java - 为什么我不能在 Java 接口(interface)中定义静态方法?

调用非静态方法的Java静态引用变量

java - 任务 ':common:kaptDebugKotlin' 执行失败。 > 执行 org.jetbrains.kotlin.gradle.internal.KaptExecution 时发生故障

如果计划任务花费的时间超过特定时间,Java 将停止计划任务