第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

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

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

HUWWW 2023-08-16 17:25:44
我有一個(gè)帶有默認(rèn)方法的接口,以及兩個(gè)實(shí)現(xiàn)該接口的類。其中一個(gè)類會(huì)覆蓋默認(rèn)方法,而另一個(gè)則不會(huì)。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")這里有一件奇怪的事情。禮貌類不會(huì)重寫該giveHello方法,但declaringClass該方法對(duì)象的 仍然指向Polite。那么有沒有一種方法可以檢查該類是否確實(shí)覆蓋了默認(rèn)的接口方法?我的用例看起來(lái)像這樣(假設(shè)我們可以在名為 的屬性中獲得我所要求的行為isOverriden):if (methodOfPolite.isOverriden) {  // do something} else {  // do something else}
查看完整描述

2 回答

?
慕哥9229398

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超6個(gè)贊

如KT-4779中所述,目前 Kotlin 默認(rèn)函數(shù)并未使用實(shí)際的 Java/JVM 默認(rèn)方法來(lái)實(shí)現(xiàn)。默認(rèn)實(shí)現(xiàn)位于靜態(tài)方法中,所有使用該默認(rèn)實(shí)現(xiàn)的類都只調(diào)用該靜態(tài)方法。這樣做是為了確保 Kotlin 默認(rèn)函數(shù)也可以在尚不具備這些函數(shù)的 1.6 JVM 目標(biāo)上運(yùn)行。

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

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 反射認(rèn)為兩個(gè)類都重寫了該函數(shù),即因?yàn)樗鼈儗?shí)際上確實(shí)如此。


您需要在這里使用 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


查看完整回答
反對(duì) 回復(fù) 2023-08-16
?
飲歌長(zhǎng)嘯

TA貢獻(xiàn)1951條經(jīng)驗(yàn) 獲得超3個(gè)贊

在這種特定情況下,我認(rèn)為該isDefault()方法應(yīng)該返回true.

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

不過(guò),您可以使用 kotlin 反射,用于declaredMembersKClass.?kotlin.reflect.full請(qǐng)注意,由于使用了擴(kuò)展方法,因此需要導(dǎo)入。


查看完整回答
反對(duì) 回復(fù) 2023-08-16
  • 2 回答
  • 0 關(guān)注
  • 155 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)