2016-06-11 161 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