Поместите отражение. Метод в функциональный интерфейс - PullRequest
0 голосов
/ 28 мая 2018

Например, у меня есть класс с методом

public class SomeClass {
    public void someMethod(Object arg) {
        //some code
    }
}

И я получил метод путем отражения в другом классе:

SomeClass instance = new SomeClass();

Method method = someClass.class.getMethod();

Есть ли способ поместить его вConsumer<Object> и затем используйте с Consumer.accept(), или я должен использовать что-то вроде этого:

Consumer<Object> consumer = object -> method.invoke(instance, new Object())

1 Ответ

0 голосов
/ 28 мая 2018

Вы можете создать Consumer динамически:

static class SomeClass {
    public void someMethod(Object arg) {
        System.out.println("test" + arg);
    }
}


static Consumer<Object> findConsumer(SomeClass instance) {
    try {
        MethodHandles.Lookup lookup = MethodHandles.lookup();
        MethodType methodType = MethodType.methodType(void.class, Object.class);

        return (Consumer<Object>) LambdaMetafactory.metafactory(
                lookup,
                "accept",
                MethodType.methodType(Consumer.class, SomeClass.class),
                methodType,
                lookup.findVirtual(SomeClass.class, "someMethod", methodType),
                methodType)
                .getTarget()
                .invokeExact(instance);
    } catch (Throwable t) {
        t.printStackTrace();
        throw new RuntimeException();
    }
}

и использовать его:

Consumer<Object> consumer = findConsumer(new SomeClass());
    consumer.accept("hello world");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...