将反射方法作为参数(函数接口)传递



>我有以下功能接口

@FunctionalInterface
public interface Processor { void handle(String text); }

我有一个方法

doSomething(Processor processor)

我可以称doSomething Like 这样

public class Demo {
public void rockTheWorldTest(String text) {
// Processing 
}
}

我可以像下面这样称呼它

doSomething(new Demo::rockTheWorldTest);

但是我将无法知道特定类中方法的名称,我想使用另一个类的反射来调用它

Method[] testClasMethods = DemoAbstractOrchestratorTest.getClass().getDeclaredMethods();
for (Method method : testClasMethods) {
doSomething(method) // Not able to do this.
}

我不知道导致您采用这种方法的情况和背景,但一种方法是:

(假设你正在循环Demo.class.getDeclaredMethods())

doSomething((text) -> {
try {
method.invoke(new Demo(), text);
} catch (Exception e) {
e.printStackTrace();
}
});

这或多或少相当于method正好rockTheWorldTest时的调用doSomething(new Demo()::rockTheWorldTest);,其实我觉得要确保method的签名"匹配"void handle(String text)的签名。我会在执行"调用"循环之前过滤testClasMethods只留下匹配的方法。