這篇博客,我思來想去講kotlin什麼呢?然後想想,還是先從簡單的入手,就講java 調用kotlin時,設計到的一些註釋。
(1)@JvmField:如果需要在 Java 中將 Kotlin 的屬性作爲字段暴露,那就需要使用 @JvmField 註解對其標註。例如:
class User {
var age: Int;
var sex: String;
constructor(name: String, age: Int, sex: String) {
this.sex = sex;
this.age = age;
}
}
那,在java類中,怎麼獲取 age 成員變量的值呢?
User user=new User("jimTrency",28,"男");
user.getAge()
如果:你想直接調用呢?如:user.age
解決方法,在對應的kotlin類對應的字段添加對應的註釋就行了。
@JvmField var age: Int;
ps: lateinit 修飾符 和 const 修飾符。也可將 Kotlin的屬性作爲字段暴露出來。
(2)@JvmStatic
class User {
var age: Int;
var sex: String;
constructor(name: String, age: Int, sex: String) {
this.sex = sex;
this.age = age;
}
companion object {
fun foo(): String {
return "haha";
}
}
}
在java類中,怎麼調用foo()函數呢?如下:
User user=new User("jimTrency",28,"男");
user.Companion.foo();
//User .Companion.foo();//這樣調用也行
那,我想這麼調用呢?User .foo();該怎麼做,不說你們肯定也知道了。
companion object {
@JvmStatic fun foo(): String {
return "haha";
}
}
ps:這個註釋 @JvmStatic, 在Kotlin類中, 只可以爲命名對象或伴生對象中定義的函數生成靜態方法。
(3)@JvmName :解決簽名衝突
fun List<String>.filterValid(){}
@JvmName("filterValidInt")
fun List<Int>.filterValid(){}
(4)@JvmOverloads : 使Java 調用該函數時暴露多個重載
@JvmOverloads fun f(a: String, b: Int = 0, c: String = "jimTrency") {
}
在java類調用時,呈現的狀態:
// Java
void f(String a, int b, String c) { }
void f(String a, int b) { }
void f(String a) { }
(5)@Throws :Kotlin 沒有受檢異常。 所以,通常 Kotlin 函數的 Java 簽名不會聲明拋出異常。 於是如果我們有一個這樣的 Kotlin 函數:
fun testThrow(){
throw Exception()
}
在java類中調用:(user:爲User類的對象,裏面有testThrow()函數)
try {
user.testThrow();
}catch (Exception e){
// 錯誤:testThrow() 未在 throws 列表中聲明 Exception
e.printStackTrace();
}
那怎麼解決這個問題呢?sb,就知道添加對應的註釋,就ok了。
@Throws
fun testThrow(){
throw Exception()
}