Kotlin学习(七)-- java和kotlin混合开发时常用注解的使用@JvmName,@JvmField,@JvmOverloads, @JvmStatic....

总结在最下面:
一.@JvmName : 修改原kt文件对应的类目
用法:

@file:JvmName("Kt_ZhuJie")
package com.practice.day03

必须写在包名上面否则报错
在这里插入图片描述
用处:
对于kt文件
在这里插入图片描述
反编译后生成的类:ZhujieKt,是自动生成的,不能自己随心所欲的命名
Kotlin学习(七)-- java和kotlin混合开发时常用注解的使用@JvmName,@JvmField,@JvmOverloads, @JvmStatic...._第1张图片
在Java端调用就必须是:

ZhujieKt.show();

而加了注解后:

@file:JvmName("Kt_text")
package com.practice.day03

Kotlin学习(七)-- java和kotlin混合开发时常用注解的使用@JvmName,@JvmField,@JvmOverloads, @JvmStatic...._第2张图片
这样就可以自己改变类的名字了,Java中调用就可以直接

Kt_text.show();

二. @JvmField : 消除kotlin的默认私有访问权限,使Java端可以以public调用

 var name = "Allen"

未添加注解前:
反编译:
在这里插入图片描述
添加注解后:

    @JvmField
    var name = "Allen"

反编译:
在这里插入图片描述
这样在Java端就可以正常调用了

三. @JvmOverloads : 使Kotlin的方法得到重载,Java端方便调用
在kotlin使用方法的参数默认值:
为加注解时:

fun method(name : String, age : Int = 18){
    println("我的名字是: ${name},我今年 $age 岁了")
}

Kotlin端调用:

  println(method("Allen"))

根据Kotlin参数的默认值机制,在Kotlin端可以只传入一个参数,不会报错
而Java端调用Kotlin端的代码,则必须传入俩个参数,否则报错
在这里插入图片描述
看一下反编译:
Kotlin学习(七)-- java和kotlin混合开发时常用注解的使用@JvmName,@JvmField,@JvmOverloads, @JvmStatic...._第3张图片
所以在Java端必须把俩个参数都写完整
而加了注解后反编译:
Kotlin学习(七)-- java和kotlin混合开发时常用注解的使用@JvmName,@JvmField,@JvmOverloads, @JvmStatic...._第4张图片
生成的函数是这个,所以在Java端调用的时候只需要传入一个参数即可
四. @JvmStatic : 把Companion object里面的内容拿出来放在外面,便于Java端直接调用
直接上例子感受一下:
未加注解前:

class Person_Test{

    companion object{
        val name = "Allen"
        fun showMethod(name : String){
            println("${name} 今年18岁了")
        }
    }


}

对于这个类,kotlin端调用showMethod的时候非常方便,跟Java的Static一样,直接:

 Person_Test.showMethod("Allen")

而在Java端必须这样:

Person_Test.Companion.showMethod("Allen");
//Person_Test.showMethod("Allen");会报错

至于Java为什么要这么调用具体原因得看反编译后的结果:

Kotlin学习(七)-- java和kotlin混合开发时常用注解的使用@JvmName,@JvmField,@JvmOverloads, @JvmStatic...._第5张图片
companion abject反编译后其实又生成了一个Companion类,然后showMethod被封装在了里面,因此在Java端调用的时候必须加上Compaion,去调用它里面的方法

加了注解后:

        @JvmStatic
        fun showMethod(name : String){
            println("${name} 今年18岁了")
        }

Java端就可以直接这样调用:

Person_Test.showMethod("Allen");

来看一下反编译后的,看看它背后做的事情:
Kotlin学习(七)-- java和kotlin混合开发时常用注解的使用@JvmName,@JvmField,@JvmOverloads, @JvmStatic...._第6张图片
这么看就非常清楚了,它背后其实是在外部封装了一个static 的showMethod方面,然后也是调用了Companion里面的showMethod方法,这样做的好处就是Java端可以直接像调用static的方法一样去调用showMethod方法

总结:
1.@JvmName:便于去修改kt文件背后生成的类名,必须写在包名上面
2.@JvmField: 消除kotlin的默认私有访问权限
3.@JvmOverloads: 生成重载方法,便于Java在调用有默认值参数的函数的时候 可以直接传入无默认值的那些参数
4.@JvmStatic:使Java在调用派生类Companion Object的函数使能够像调用static方法一样,直接xx类 . xx方法

你可能感兴趣的:(Kotlin从基础到进阶,java,kotlin,android)