2016-06-11 199 views
1

我正在尋找一種方法來傳遞ClassMethod作爲方法的參數。我有重複的代碼,我想減少。傳遞類和方法作爲參數

我想是這樣的:

public static void methodName(Class C, Method m) {   
    C.m.sendKeys("item");      
} 

這可能嗎?

回答

0

是的,你可以使用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包中不同類型的方法。

1

在Java 8中,您可以使用作爲lambda傳遞的方法引用;

methodName(C::m); 

你需要指定函數的類型(參數和返回值),並使用現有的功能接口之一或定義自己。

例如,如果您的函數返回一個布爾並採取類T作爲輸入的目的,則可以使用預定義的功能接口Predicate

public static void methodName(Item item, Predicate<Item> p) { 
    p.test(item); 
    // ... 
} 
+0

未在Java 8中,可以通過接口與匿名的實現較早的版本 – Benedictus