您好,登錄后才能下訂單哦!
帶你了解Kotlin中的Jvm注解?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
JvmOverloads
創建一個kotlin的類
class Student(val name: String, val sex: Int = 1, val age: Int = 18)
可以看出來 這個構造函數的參數是有默認值的,kotlin的特性對吧,我們在使用的時候可以方便的使用,比如:
val student = Student("wuyue") val student2 = Student("wuyue", age = 18)
但是這個特性如果你用java來調用你就是失敗的了。
注意看下面的方法調用是報錯的,不能調,只能選擇3個構造函數的方法。
那我一定要讓java也可以調用 怎么辦? 加上注解即可:
class Student @JvmOverloads constructor(val name: String, val sex: Int = 1, val age: Int = 18)
這個對于android程序員來說還是很重要的,比如我們自定義view中 就需要這個注解,否則運行起來 會因為找不到方法而報錯的。
所以大家只要謹記一點: 當你的kotlin代碼中的某個方法使用了 默認參數值 這個kotlin語言的特性并且這個方法還要給java代碼調用的時候那你最好加上JvmOverloads 注解
JvmName
我們給String 增加一個擴展函數 StringsHelper.kt 文件
package com.test fun String.appendUserName():String{ return this+"wuyue" }
在java的世界里 怎么調用他呢?
StringsHelperKt.appendUserName("hello");
很好理解對吧, 但是很多人都習慣于在java的世界中 使用什么xxxUtils 去處理類似的情況。這個時候就要利用到這個JvmName了
@file:JvmName("StringsHelperUtils") package com.test fun String.appendUserName():String{ return this+"wuyue" }
如此一來 我們在java的世界中 調用他的方法就變成了
StringsHelperUtils.appendUserName("hello");
JvmMultifileClass
關于這個注解 網上的說法是 可以將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世界中 調用Utils這個類 就有one和two 2個方法了,但是我自己的實驗結果 我就算去掉這個JvmMultifileClass 這個注解也一樣可以達到效果。似乎這個注解并沒有什么用? 可能是1.3之后的kotlin版本 優化了 JvmName的實現吧。 這里有知道原因的大佬可以指點一下。
JvmField
還是前面這個Student的例子
class Student( val name: String, val sex: Int = 1, val age: Int = 18)
如果在java代碼里 你要調用他里面的屬性 只能通過get和set 來調用。 但是如果你加上注解
class Student(@JvmField val name: String, val sex: Int = 1, val age: Int = 18)
那他在java的世界中就可以 直接調用了
student.name="hello";
另外還有一個重要的作用是: 在kotlin中, val 并不意味著是常量,只不過val 聲明的變量 是沒有set方法的,只有get方法。所以給了你一個常量的錯覺。 你要真正的 在kotlin中 定義一個常量,只有兩種方法:
JvmStatic
class StaticTest{ companion object{ const val field1="111" val field2="222" @JvmField val field3="333" fun callNonStatic(){ } @JvmStatic fun callStatic(){ } } }
我們看一下 在java代碼中 怎么調用他們 就知道這個注解的實際作用了
StaticTest.callStatic(); StaticTest.Companion.callNonStatic(); String t1 = StaticTest.field1; String t2=StaticTest.Companion.getField2(); String t3=StaticTest.field3;
JvmSynthetic
這個注解用的不多,但是kotlin的許多官方庫會用到他 講白了 如果你寫的一個函數你只想給kotlin代碼調用 而不想給java的代碼調用 那你就在你的函數上面加上這個注解即可
例如:
@file:JvmName("StringsHelperUtils") package com.test @JvmSynthetic fun String.appendUserName():String{ return this+"wuyue" }
這樣你就會發現 這個函數 你用kotlin正常使用 而java代碼里StringsHelperUtils 這個類 是沒有這個方法的
看完上述內容,你們掌握帶你了解Kotlin中的Jvm注解的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。