Передать метод отражения в качестве аргумента (функциональный интерфейс) - PullRequest
0 голосов
/ 03 августа 2020

У меня есть следующий функциональный интерфейс

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

У меня есть метод

doSomething(Processor processor)

Я могу вызвать doSome something like this

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.
}

1 Ответ

1 голос
/ 03 августа 2020

Я не знаю обстоятельств или контекста, которые побудили вас применить этот подход, но способ сделать это будет:

(при условии, что вы перебираете Demo.class.getDeclaredMethods())

doSomething((text) -> {
        try {
                method.invoke(new Demo(), text);

        } catch (Exception e) {
                e.printStackTrace();
        }
});

, что более или менее эквивалентно вызову doSomething(new Demo()::rockTheWorldTest);, когда method в точности соответствует rockTheWorldTest, на самом деле, я думаю, вы должны убедиться, что подпись method "совпадает" с подписью void handle(String text). Я бы отфильтровал testClasMethods перед выполнением «вызова» l oop, оставив только подходящие методы.

...