天天看點

kotlin+android+注解,教你一文搞懂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來調用你就是失敗的了。

kotlin+android+注解,教你一文搞懂Kotlin中的Jvm注解

注意看下面的方法調用是報錯的,不能調,隻能選擇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中 定義一個常量,隻有兩種方法:

在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代碼中 怎麼調用他們 就知道這個注解的實際作用了

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注解的文章就介紹到這了,更多相關Kotlin Jvm注解内容請搜尋豬先飛以前的文章或繼續浏覽下面的相關文章希望大家以後多多支援豬先飛!