传递类和方法作为参数
问题描述:
我正在寻找一种方法来传递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