簡體   English   中英

如何調用Class提供的接口默認方法<!--?--> object?

[英]How do I call default method of interface provided by Class<?> object?

我需要調用接口的默認方法(並獲取返回值),但該接口是由Class object提供的。(我的項目中沒有其他方法可以傳遞Class)

這是一個例子:假設我有一個界面:

public interface IExample {
     void someOtherAbstractMethod();
     default String method() {
         return "Test";
     }
}

現在想象我有方法

String getReturnValueOfInterfaceMethod(Class<T> clazz, String method_name) throws Exception {
    if (!clazz.isInterface()) return null;
    Method m = clazz.getMethod(method_name);
    if (!m.isDefault()) throw new Exception();
    // invoke the method and return the value ("Test")
}

對於復雜的項目,這只是一個例子!!!!

我唯一的想法是使用Method#invoke(Object, Object...)方法,但我需要一個實例。 所以我想我需要從該接口創建一個匿名 class 的實例(其他方法實現為空或返回默認值)。 我怎么做? 或者是否有任何其他方法可以在不更改 IExample 定義的情況下執行此操作。

謝謝!

因為默認方法根據定義是實例方法,所以我們首先需要一個接口實例。

幸運的是, java.lang.reflect.Proxy正是這樣做的:

var proxy = Proxy.newProxyInstance(IExample.class.getClassLoader(),
    new Class<?>[] {IExample.class}, (m, p, a) -> null);

請注意,我確實將一個非常簡單的調用處理程序傳遞給了代理——當使用代理 object 時,這可能會產生錯誤。
如果默認方法調用代理中的其他方法,這將很重要。

然后我們可以使用InvocationHandler.invokeDefault來調用默認方法:

Object result = InvocationHandler.invokeDefault(proxy, IExample.class.getMethod("method"));

同樣,如果默認方法調用其他方法,包括默認方法主體中的其他默認方法,這將產生問題。
如果需要,您需要編寫更好/更高級的調用處理程序。

另請注意,在 Java 16 中添加了InvocationHandler.invokeDefault

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM