我正在尋找一種方法來傳遞Class
和Method
作爲方法的參數。我有重複的代碼,我想減少。傳遞類和方法作爲參數
我想是這樣的:
public static void methodName(Class C, Method m) {
C.m.sendKeys("item");
}
這可能嗎?
我正在尋找一種方法來傳遞Class
和Method
作爲方法的參數。我有重複的代碼,我想減少。傳遞類和方法作爲參數
我想是這樣的:
public static void methodName(Class C, Method m) {
C.m.sendKeys("item");
}
這可能嗎?
是的,你可以使用Consumer<...>
這個。例如:
class MyClass {
public static void methodToPass(String arg) {...}
}
public static void methodName(Consumer<String> cons) {
cons.accept("item");
}
然後調用,如:
methodName(MyClass::methodToPass);
這也適用於實例方法,與語法:
MyClass mc = new MyClass();
methodName(mc::methodToPass);
或者,使用BiConsumer<...>
,其中如果傳遞的第一個參數必須是調用該方法的實例:
methodName(MyClass::methodToPass);
public static void methodName(BiConsumer<MyClass, String> cons) {
MyClass mc = ...;
cons.accept(mc, "item");
}
這隻要可以作爲我們正在調用方法需要您指定爲Consumer<...>
類型參數的類型的一個參數。
還有其他接口可用,如Consumer<...>
,它們適用於java.util.function包中不同類型的方法。
在Java 8中,您可以使用作爲lambda傳遞的方法引用;
methodName(C::m);
你需要指定函數的類型(參數和返回值),並使用現有的功能接口之一或定義自己。
例如,如果您的函數返回一個布爾並採取類T作爲輸入的目的,則可以使用預定義的功能接口Predicate
:
public static void methodName(Item item, Predicate<Item> p) {
p.test(item);
// ...
}
未在Java 8中,可以通過接口與匿名的實現較早的版本 – Benedictus