Kotlin注解之@JvmOverloads@JvmStatic@JvmField@JvmName
Posted Jason_Lee155
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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();
以上是关于Kotlin注解之@JvmOverloads@JvmStatic@JvmField@JvmName的主要内容,如果未能解决你的问题,请参考以下文章