kotlin的扩展方法,其实是以java的静态方法形式存在的,也就是说如果要用java调用kotlin的扩展方法,和调用静态函数一样
调用扩展属性也是相同的道理
举个例子,我们在某个kotlin文件(文件名为Utils.kt)里为Throwable写一个根据错误类型返回错误消息的扩展方法:
fun Throwable.getShowMsg1() = when(this){
is HttpException ->"${
when(code()){
401 -> "文件未授权或证书错误"
403 -> "服务器拒绝请求"
404 -> "服务器找不到请求的文件"
408 -> "请求超时,服务器未响应"
500 -> "服务器内部错误)服务器遇到错误,无法完成请求。"
502 -> "服务器从上游服务器收到无效响应。"
503 -> "服务器目前无法使用"
504 -> "服务器从上游服务器获取数据超时"
else -> "服务器错误"
}
},错误码:${code()}"
is ParseException -> "json格式错误"
is JSONException -> "json解析错误"
is JsonParseException -> "json参数错误"
is SSLHandshakeException -> "证书验证失败"
is SocketTimeoutException -> "连接超时"
is UnknownHostException -> "网络链接失败"
is ErrnoException -> "网络不可访问"
is OnErrorNotImplementedException -> cause?.showMsg?:message?:"未知错误"
else -> message?:"未知错误"
}
在kotlin里可以直接调用:
fun printError(t:Throwable){
println(t.getShowMsg1())
}
在java里,会被编译成静态方法,调用时以静态方法的方式调用:
public void printError(Throwable t){
//java调用kotlin扩展方法:
//文件名.扩展名(扩展类),例如:UtilsKt.getShowMsg1(t)
//注意,扩展方法写在Utils.kt文件里,因此类名应该是:UtilsKt
//以下写法与上面kotlin的写法等价
System.out.println(UtilsKt.getShowMsg1(t));
}
扩展属性的调用与扩展方法类似,依然以返回错误类型的错误消息为例:
为Throwable写一个showMsg的扩展属性:
val Throwable.showMsg:String get() = when(this){
is HttpException ->"${
when(code()){
401 -> "文件未授权或证书错误"
403 -> "服务器拒绝请求"
404 -> "服务器找不到请求的文件"
408 -> "请求超时,服务器未响应"
500 -> "服务器内部错误)服务器遇到错误,无法完成请求。"
502 -> "服务器从上游服务器收到无效响应。"
503 -> "服务器目前无法使用"
504 -> "服务器从上游服务器获取数据超时"
else -> "服务器错误"
}
},错误码:${code()}"
is ParseException -> "数据格式错误,请稍后重试"//后台返回的json格式有误,导致解析失败
is JSONException -> "发送的数据不正确,请稍后重试"//前端发送给后台的json格式有误
is JsonParseException -> "json参数异常导致解析失败" //后台返回的json格式有误,Gson解析失败
is SSLHandshakeException -> "证书验证失败"
is SocketTimeoutException -> "连接超时,请稍后重试"
is TimeoutException -> "连接超时,服务器未在设定时间内回应,请稍后重试"
is UnknownHostException -> "网络链接失败"
is ErrnoException -> "网络不可访问"
is OnErrorNotImplementedException -> cause?.showMsg?:message?:"未知错误"
else -> message?:"未知错误"
}
在kotlin里调用该扩展属性:
fun printError(t:Throwable){
println(t.showMsg)
}
在java里调用
public void printError(Throwable t){
//kotlin的扩展属性,编译时同样会改成静态方法,
// 调用方式与调用扩展方法类似
System.out.println(UtilsKt.getShowMsg(t));
}