亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 Kotlin 或 Java 中的 Reflection 檢查類是否覆蓋了接口的默認方法?

如何使用 Kotlin 或 Java 中的 Reflection 檢查類是否覆蓋了接口的默認方法?

HUWWW 2023-08-16 17:25:44
我有一個帶有默認方法的接口,以及兩個實現該接口的類。其中一個類會覆蓋默認方法,而另一個則不會。interface MyType {  fun giveHello(): String = "Hello!"}class Polite: MyType {  // Does not override giveHello()}class Rude: MyType {  override fun giveHello(): String = "I don't like you"}我可以giveHello使用反射訪問該方法,如下所示:val methodOfPolite = Polite::class.java.getDeclaredMethod("giveHello")val methodOfRude = Rude::class.java.getDeclaredMethod("giveHello")這里有一件奇怪的事情。禮貌類不會重寫該giveHello方法,但declaringClass該方法對象的 仍然指向Polite。那么有沒有一種方法可以檢查該類是否確實覆蓋了默認的接口方法?我的用例看起來像這樣(假設我們可以在名為 的屬性中獲得我所要求的行為isOverriden):if (methodOfPolite.isOverriden) {  // do something} else {  // do something else}
查看完整描述

2 回答

?
慕哥9229398

TA貢獻1877條經驗 獲得超6個贊

如KT-4779中所述,目前 Kotlin 默認函數并未使用實際的 Java/JVM 默認方法來實現。默認實現位于靜態方法中,所有使用該默認實現的類都只調用該靜態方法。這樣做是為了確保 Kotlin 默認函數也可以在尚不具備這些函數的 1.6 JVM 目標上運行。

所以你的代碼大致可以編譯成這樣的 Java 等價物:

public interface MyType {

? public String giveHello();


? public static class MyTypeImpls {

? ? ?public static String giveHello() { return "Hello!" }

? }

}


public final class Polite implements MyType {

? //does not override

? public String giveHello() { return MyType.MyTypeImpls.giveHello() }

}


public final class Rude implements MyType {

? //does override

? override fun giveHello() { return "I don't like you" }

}

這就是為什么 java 反射認為兩個類都重寫了該函數,即因為它們實際上確實如此。


您需要在這里使用 Kotlin 反射,特別是declaredMemberFunctions和memberFunctions:


fun overridesGiveHello<T: MyType>(cls: KClass<T>) =

? ? ? ? cls.memberFunctions.first { it.name == "giveHello" } in cls.declaredFunctions


println(overridesGiveHello(Polite::class)) //false

println(overridesGiveHello(Rude::class))? //true


查看完整回答
反對 回復 2023-08-16
?
飲歌長嘯

TA貢獻1951條經驗 獲得超3個贊

在這種特定情況下,我認為該isDefault()方法應該返回true.

我本希望Polite::class.java.getMethod("giveHello")返回該方法,但沒有getDeclaredMethod(),但我們正處于在 Kotlin 類和接口上使用 Java 反射的世界中。Java 的期望可能無法得到滿足。

不過,您可以使用 kotlin 反射,用于declaredMembersKClass.?kotlin.reflect.full請注意,由于使用了擴展方法,因此需要導入。


查看完整回答
反對 回復 2023-08-16
  • 2 回答
  • 0 關注
  • 148 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號