Kotlin之注解

注解是Java代码调用kotlin代码,kotlinJava兼容提供的一种解决方案

1、 @JvmName

注解的作用就是更改kotlin源文件名称、方法名称

  1. 源文件名称修改
    假设有一个kotlin文件 KotlinAnnotationAnnotation.kt,文件中有一个方法 getKotlinFunShow()
fun getKotlinFunShow() {
    println("当前是kotlin文件中最外层的方法")
}

我们知道每一个 kotlin 源文件默认会编译出一个 java 类,类的命名默认是文件名+Kt

在Java中调用

KotlinAnnotationAnnotationKt.getKotlinFunShow();

虽然这也能调用,但是名字太长,我们就可以借助注解更改源文件名称
注意:需要写在package前面

@file:JvmName("KotlinTest")

package com.example....

再次调用

 KotlinTest.getKotlinFunShow();
  1. 方法名称

普通方法更改

@JvmName("show")
fun getKotlinFunShow() {
    println("当前是kotlin文件中最外层的方法")
}

get/set方法名字更改

var name = _name
    @JvmName("setNameInfo")
    set

val age = _age
    @JvmName("getAgeInfo")
    get

2、@JvmField

注解的作用是让 var/val 属性不会再生成get/set方法,让Java代码可以直接方法属性

未注解时候访问

class KotlinNote(_name: String, _age: Int) {
    var name = _name
    val age = _age
}
KotlinNote kt = new KotlinNote("122", 12);
    kt.getName();
    kt.setName("java");
    kt.getAge();

注解后

class KotlinNote(_name: String, _age: Int) {
    @JvmField
    var name = _name
    @JvmField
    val age = _age
}
KotlinNote kt = new KotlinNote("122", 12);
String name = kt.name;
kt.name="java";
int age = kt.age;

3、@JvmOverloads

注解的作用就是用来解决Java中的方法是不支持默认参数问题

如下例子:kotlin主构造、方法存在默认参数

class KotlinPerson (val name: String, val age: Int = 8) {

    fun showInfo(name: String, age: Int = 8, sex: Char = '男') {
        println("name=$name,age=$age,sex=$sex")
    }
    
    fun toast(name: String, age: Int = 8, sex: Char = '男'){
        println("name=$name,age=$age,sex=$sex")
    }

}

//kotlin调用可以之传一个参数
val kotlinPerson=KotlinPerson("kotlin")
kotlinPerson.showInfo("kotlin")
kotlinPerson.toast("kotlin")

 KotlinPerson kotlinPerson=new KotlinPerson("Java",44);
 kotlinPerson.showInfo("Java",44,'M');
 kotlinPerson.toast("Java",44,'M');

使用 @JvmOverloads 注解后
注意:主构造添加注解后 constructor 不能省略

class KotlinPerson @JvmOverloads constructor(val name: String, val age: Int = 8) {

    fun showInfo(name: String, age: Int = 8, sex: Char = '男') {
        println("name=$name,age=$age,sex=$sex")
    }
    
    @JvmOverloads
    fun toast(name: String, age: Int = 8, sex: Char = '男'){
        println("name=$name,age=$age,sex=$sex")
    }

}

构造方法、toast加了注解后就可以使用默认参数了

 KotlinPerson kotlinPerson=new KotlinPerson("Java");
 kotlinPerson.showInfo("Java",44,'M');
 kotlinPerson.toast("Java");

4、@JvmStatic

注解作用就是让Java代码调用kotlin派生对象是可以直接访问

class KotlinCompanion {
    companion object {

        val PLACE = "世界之窗"

        fun whatToDo(name: String) {
            println("${name}计划明天去$PLACE")
        }
    }
}
KotlinCompanion.whatToDo("kotlin")

未加注解前Java调用需要.Companion

 KotlinCompanion.Companion.whatToDo("Java");
class KotlinCompanion {
    companion object {
        @JvmStatic
        val PLACE = "世界之窗"
        
        @JvmStatic
        fun whatToDo(name: String) {
            println("${name}计划明天去$PLACE")
        }
    }
}

注解后,可以直接用

KotlinCompanion.whatToDo("Java");

5、@JvmMultifileClass

注解的作用:官方解释是多个kotlin文件使用JvmName进行更改一样的名字会有问题,需要加上这个关键字,但是经过我测试好像去掉也没报错。。。

有人知道的可以私信告诉我

@file:JvmName("KotlinUtil")
@file:JvmMultifileClass

package com.example.mykotlin2.note

class KotlinNote2 {

}

fun functionA() {

}
@file:JvmName("KotlinUtil")
@file:JvmMultifileClass

package com.example.mykotlin2.note

class KotlinNote3 {

}

fun functionB(){

}

在Java中调用,可以直接用KotlinUtil调用两个函数

KotlinUtil.functionA();
KotlinUtil.functionB();

6、@JvmSynthetic

注解的作用是让这个函数不让Java代码调用,加在函数上方

@JvmSynthetic
fun showInfo(name: String, age: Int = 8, sex: Char = '男') {
    println("name=$name,age=$age,sex=$sex")
}

注解后,Java中无法调用showInfo方法

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值