教你一文搞懂Kotlin中的Jvm注解
JvmOverloads
創(chuàng)建一個kotlin的類
class Student(val name: String, val sex: Int = 1, val age: Int = 18)
可以看出來 這個構(gòu)造函數(shù)的參數(shù)是有默認值的,kotlin的特性對吧,我們在使用的時候可以方便的使用,比如:
val student = Student("wuyue")
val student2 = Student("wuyue", age = 18)
但是這個特性如果你用java來調(diào)用你就是失敗的了。

注意看下面的方法調(diào)用是報錯的,不能調(diào),只能選擇3個構(gòu)造函數(shù)的方法。
那我一定要讓java也可以調(diào)用 怎么辦? 加上注解即可:
class Student @JvmOverloads constructor(val name: String, val sex: Int = 1, val age: Int = 18)
這個對于android程序員來說還是很重要的,比如我們自定義view中 就需要這個注解,否則運行起來 會因為找不到方法而報錯的。
所以大家只要謹記一點: 當你的kotlin代碼中的某個方法使用了 默認參數(shù)值 這個kotlin語言的特性并且這個方法還要給java代碼調(diào)用的時候那你最好加上JvmOverloads 注解
JvmName
我們給String 增加一個擴展函數(shù) StringsHelper.kt 文件
package com.test
fun String.appendUserName():String{
return this+"wuyue"
}
在java的世界里 怎么調(diào)用他呢?
StringsHelperKt.appendUserName("hello");
很好理解對吧, 但是很多人都習慣于在java的世界中 使用什么xxxUtils 去處理類似的情況。這個時候就要利用到這個JvmName了
@file:JvmName("StringsHelperUtils")
package com.test
fun String.appendUserName():String{
return this+"wuyue"
}
如此一來 我們在java的世界中 調(diào)用他的方法就變成了
StringsHelperUtils.appendUserName("hello");
JvmMultifileClass
關(guān)于這個注解 網(wǎng)上的說法是 可以將2個kt文件 里面的代碼 合并到一個java的class文件中。
FunA.kt
@file:JvmName("Utils")
@file:JvmMultifileClass
package com.test
fun one(){
}
FunB.kt
@file:JvmName("Utils")
@file:JvmMultifileClass
package com.test
fun two(){
}
這樣在java世界中 調(diào)用Utils這個類 就有one和two 2個方法了,但是我自己的實驗結(jié)果 我就算去掉這個JvmMultifileClass 這個注解也一樣可以達到效果。似乎這個注解并沒有什么用? 可能是1.3之后的kotlin版本 優(yōu)化了 JvmName的實現(xiàn)吧。 這里有知道原因的大佬可以指點一下。
JvmField
還是前面這個Student的例子
class Student( val name: String, val sex: Int = 1, val age: Int = 18)
如果在java代碼里 你要調(diào)用他里面的屬性 只能通過get和set 來調(diào)用。 但是如果你加上注解
class Student(@JvmField val name: String, val sex: Int = 1, val age: Int = 18)
那他在java的世界中就可以 直接調(diào)用了
student.name="hello";
另外還有一個重要的作用是: 在kotlin中, val 并不意味著是常量,只不過val 聲明的變量 是沒有set方法的,只有g(shù)et方法。所以給了你一個常量的錯覺。 你要真正的 在kotlin中 定義一個常量,只有兩種方法:
- 在top-level或者object中 使用 const val
- 或者使用 @JvmField val(這種方式定義的就是常量了,講白了你也無法重寫val的get方法了)
JvmStatic
class StaticTest{
companion object{
const val field1="111"
val field2="222"
@JvmField val field3="333"
fun callNonStatic(){
}
@JvmStatic
fun callStatic(){
}
}
}
我們看一下 在java代碼中 怎么調(diào)用他們 就知道這個注解的實際作用了
StaticTest.callStatic();
StaticTest.Companion.callNonStatic();
String t1 = StaticTest.field1;
String t2=StaticTest.Companion.getField2();
String t3=StaticTest.field3;
JvmSynthetic
這個注解用的不多,但是kotlin的許多官方庫會用到他 講白了 如果你寫的一個函數(shù)你只想給kotlin代碼調(diào)用 而不想給java的代碼調(diào)用 那你就在你的函數(shù)上面加上這個注解即可
例如:
@file:JvmName("StringsHelperUtils")
package com.test
@JvmSynthetic
fun String.appendUserName():String{
return this+"wuyue"
}
這樣你就會發(fā)現(xiàn) 這個函數(shù) 你用kotlin正常使用 而java代碼里StringsHelperUtils 這個類 是沒有這個方法的
到此這篇關(guān)于教你一文搞懂Kotlin中的Jvm注解的文章就介紹到這了,更多相關(guān)Kotlin Jvm注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android實現(xiàn)ImageView陰影和圖層效果
這篇文章主要為大家詳細介紹了Android實現(xiàn)ImageView陰影和圖層效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-02-02
Android列表實現(xiàn)(1)_數(shù)組列表實例介紹
最近開始學習android的ui,先上幾個相關(guān)的例子,后續(xù)還會有更新,感興趣的朋友可以研究下2012-12-12
Android NavigationView頭部設(shè)置監(jiān)聽事件
這篇文章主要為大家詳細介紹了Android NavigationView頭部設(shè)置監(jiān)聽事件,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10
Android使用vitamio插件實現(xiàn)視頻播放器
這篇文章主要為大家詳細介紹了Android使用vitamio實現(xiàn)視頻播放器,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-04-04
Android源碼解析onResume方法中獲取不到View寬高
這篇文章主要為大家介紹了Android源碼解析onResume方法中獲取不到View寬高示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02
Android ScrollView嵌套橫向滑動控件時沖突問題
本篇文章主要介紹了Android ScrollView嵌套橫向滑動控件時沖突問題,具有一定的參考價值,有興趣的可以了解一下2017-08-08
android 關(guān)于利用簽名的SHA1進行安全校驗的方法之一(推薦)
下面小編就為大家?guī)硪黄猘ndroid 關(guān)于利用簽名的SHA1進行安全校驗的方法之一(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01

