Java 将reflect.Method放入函数接口

Java 将reflect.Method放入函数接口,java,reflection,lambda,java-8,method-reference,Java,Reflection,Lambda,Java 8,Method Reference,例如,我有一个带有方法的类 public class SomeClass { public void someMethod(Object arg) { //some code } } 我在另一节课上通过反思获得了方法: SomeClass instance = new SomeClass(); Method method = someClass.class.getMethod(); 有没有办法将它放到消费者中,然后与消费者一起使用。accept(),或者我必

例如,我有一个带有方法的类

public class SomeClass {
    public void someMethod(Object arg) {
        //some code
    }
}
我在另一节课上通过反思获得了方法:

SomeClass instance = new SomeClass();

Method method = someClass.class.getMethod();
有没有办法将它放到
消费者
中,然后与
消费者一起使用。accept()
,或者我必须使用类似的东西:

Consumer<Object> consumer = object -> method.invoke(instance, new Object())
Consumer=object->method.invoke(实例,新对象())

您可以动态创建
消费者

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();
    }
}
静态类SomeClass{
公共方法(对象参数){
系统输出打印项次(“测试”+arg);
}
}
静态使用者findConsumer(SomeClass实例){
试一试{
MethodHandles.Lookup Lookup=MethodHandles.Lookup();
MethodType MethodType=MethodType.MethodType(void.class,Object.class);
退货(消费者)LambdaMetafactory.metafactory(
查找,
“接受”,
MethodType.MethodType(Consumer.class,SomeClass.class),
方法类型,
lookup.findVirtual(SomeClass.class,“someMethod”,methodType),
方法类型)
.getTarget()
.invokeExact(实例);
}捕获(可丢弃的t){
t、 printStackTrace();
抛出新的RuntimeException();
}
}
并使用它:

Consumer<Object> consumer = findConsumer(new SomeClass());
    consumer.accept("hello world");
Consumer=findConsumer(newsomeclass());
消费者接受(“你好世界”);

除了使用
new Object()
而不是
Object
作为参数之外,您不喜欢您的构造的哪些方面?这基本上是好的,但我真的很好奇另一个更优雅或替代的解决方案。另外,我想知道这是否被视为坏习惯。