这篇博客,我思来想去讲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()
}