Kotlin注解之@JvmOverloads、@JvmStatic、@JvmField、@JvmName
@JvmOverloads
一句话解释,就是为了解决Java不能重载kotlin 有默认参数的方法
比如Kotlin代码如下调用是没有问题的:
class TestKt { fun testJvm(a: String, b: Int = 1) { } fun abc() { testJvm("a") testJvm("a", 3) } }
但是如果java中调用:
class TestJava { private void tt() { TestKt test = new TestKt(); test.testJvm("3"); //这里会报错 test.testJvm("3", 4); } }
所以需要在Kotlin方法上添加 @JvmOverloads:
再一个是比如自定义View的构造方法中:
class CustomView @JvmOverloads constructor( private val context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : View(mContext, attrs, defStyleAttr)
就相当于写了三个构造方法:
public class CustomView extends View{ public CustomView (Context context) { this(context, null); } public CustomView (Context context, AttributeSet attrs) { this(context, attrs, 0); } public CustomView (Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); }
@JvmStatic、@JvmField
一句话解释就是为了解决在Java中不能直接调用kotlin 中的静态方法和静态变量
比如如下Kotlin代码:
class TestKt { companion object { val s = 5 fun abc() {} } fun test(){ TestKt.s TestKt.abc() } }
companion object内的是静态变量,可以直接类名.调用,但是在java中调用需要这样写:
class TestJava { private void tt() { int s = TestKt.Companion.getS(); TestKt.Companion.abc(); } }
如果想在java中也直接类名.调用静态变量或者方法的话需要如下写法:
class TestKt { companion object { @JvmField //修饰字段 val s = 5 @JvmStatic //修饰方法 fun abc() {} } }
然后java调用:
class TestJava { private void tt() { int s = TestKt.s; TestKt.abc(); } }
@JvmName
为了解决-Java调用Kotlin文件中的字段或者方法,需要在原来Kotlin文件名基础后面加Kt-,加上@JvmName 就可以去掉 后面的Kt,直接文件名调用了。
比如如下Kotlin 文件:
//文件名:TestKotlinFile.kt val s = 2 fun abc(){}
java中调用:
class TestJava { private void tt() { int s = TestKotlinFileKt.getS(); TestKotlinFileKt.abc(); } }
@file:JvmName(“TestKotlinFile”)必须写在包名的前面,否则无法起作用
@file:JvmName("TestKotlinFile") package com.test.squre val s = 2 fun abc(){}
Java中调用,就可以直接使用文件名.调用了:
class TestJava { private void tt() { int s = TestKotlinFile.getS(); TestKotlinFile.abc(); } }
@JvmMultifileClass
如果我们在同一包名下面的两个kt文件中,用@file:JvmName(“TestKotlinFile”) 注解了一样的class名字,就会报错,需要添加@JvmMultifileClass解决
//TestKotlinFile.kt @file:JvmName("TestKotlinFile") @file:JvmMultifileClass package com.test.squre val s = 2 fun abc(){} //TestKotlinFile2.kt @file:JvmName("TestKotlinFile") @file:JvmMultifileClass package com.test.squre val s2 = 6 fun abc2() {}
Java中调用:
class TestJava { private void tt() { int s = TestKotlinFile.getS(); TestKotlinFile.abc(); int s2 = TestKotlinFile.getS2(); TestKotlinFile.abc2(); } }
上一篇:
IDEA上Java项目控制台中文乱码