KotlinKotlin语言

Kotlin伴生对象及其字节码

2018-05-05  本文已影响0人  跳动的字符

 与Java不同的是,在kotlin中,类是没有显式的static方法和static成员变量的,都是通过伴生对象的形式间接提供的。下面来谈谈Kotlin中的伴生对象。

 1. 对象声明,object declaration,如下所示:

object MyObject {
    fun method() {
        println("MyObject method")
    }
}

fun main(args: Array<String>) {
    MyObject.method()
}

 2. 伴生对象,companion object,

class MyCompanion {

    companion object MyObject {

        var a:Int = 100

        @JvmStatic
        fun method() {
            println("method invoked")
        }
    }
}

fun main(args: Array<String>) {
    MyCompanion.MyObject.method() // 演示用,实际会省略MyObject
    println("--------------")

    println(MyCompanion.a)
    MyCompanion.method() // 类似于静态方法,kotlin中没有静态方法
    println("--------------")

    println(MyCompanion.javaClass)
}

注意:

 利用javap命令对伴生对象MyCompanion反编译后的结果如下:

➜  kotlin-lecture javap com.ssy.kotlin.MyCompanion
Compiled from "HelloKotlin19.kt"
public final class com.ssy.kotlin.MyCompanion {
  public static final com.ssy.kotlin.MyCompanion$MyObject MyObject;
  public com.ssy.kotlin.MyCompanion();
  static {};
  public static final int access$getA$cp();
  public static final void access$setA$cp(int);
  public static final void method();
}

通过上面的结果可以看出,加了@JvmStatic注解,会出现一个static的method()方法。
下面将@JvmStatic注解注释掉后,重新用javap进行反编译,结果如下:

➜  kotlin-lecture javap com.ssy.kotlin.MyCompanion
Compiled from "HelloKotlin19.kt"
public final class com.ssy.kotlin.MyCompanion {
  public static final com.ssy.kotlin.MyCompanion$MyObject MyObject;
  public com.ssy.kotlin.MyCompanion();
  static {};
  public static final int access$getA$cp();
  public static final void access$setA$cp(int);
}

通过上面的结果可以看出,@JvmStatic注解注释后,static的method()方法没有了。
从上面可以得出结论:伴生对象中的方法上加与不加@JvmStatic,对程序调用上(对使用者)是没有任何影响的,只是在底层的字节码形式上存在明显的差别。

好了,就先写到这里。

上一篇下一篇

猜你喜欢

热点阅读