說我有以下代碼...如何測試Method是否接受參數類型?
@FunctionalInterface
static interface MessageFunction<T> {
void send(T obj);
}
static @interface Message {
Class<?> value();
}
static class Foo {
@Message(String.class)
MessageFunction<String> bass = (string) -> {
// Do Stuff
};
}
static class MessageManager {
Map<Class<?>, MessageFunction<?>> messages = new HashMap<>();
public void register(Object obj) {
for (Field field : obj.getClass().getDeclaredFields()) {
Message message = field.getAnnotation(Message.class);
if (message != null) {
MessageFunction<?> function;
try {
function = (MessageFunction<?>) field.get(obj);
} catch (IllegalArgumentException | IllegalAccessException e) {
e.printStackTrace();
return;
}
Method sendMethod;
try {
// Will this work?
sendMethod = function.getClass().getDeclaredMethod("send", Object.class);
} catch (NoSuchMethodException | SecurityException e) {
e.printStackTrace();
return;
}
// How do I do something like this?
/*if (sendMethod.testParamaters(message.value())) {
this.messages.put(message.value(), function);
}*/
}
}
}
}
public static void main(String[] args) {
MessageManager manager = new MessageManager();
manager.register(new Foo());
}
我反映引用泛型類型的@FunctionalInterface
的字段。因爲方法參數也是通用的,所以我無法知道它接受哪些參數,因此我必須通過其他方法(註釋)傳遞它。
問題是存在註釋值和泛型類型不必匹配,似乎無法檢查。如果在註釋中列出的類型不會被接收到發送方法中,我不會註冊失敗。
我怎麼去關於這個東西,而實際上並沒有調用這個方法。有沒有辦法?更好的是,儘管我知道它最可能不可能,但是有沒有辦法知道沒有註解的參數類型是什麼?
可能的複製[獲取運行時泛型類](http://stackoverflow.com/questions/3403909/get-generic-type-of-class-at-runtime)。基本上答案是lambda的「不能完成」。 – Radiodef 2015-02-08 07:26:28
我知道有關在運行時獲取泛型類型的其他問題的答案。然而,這些解決方案似乎沒有工作時處理一個泛型功能接口的lambda – 2015-02-08 21:43:35
我發現[TypeTools](https://github.com/jhalterman/typetools)提到的是另一個關於堆棧溢出的問題。雖然它不直接解決我所問的問題,但它解決了我的特殊問題。 – 2015-02-09 06:13:47