将java.lang.reflect.Method强制转换为功能接口

将java.lang.reflect.Method强制转换为功能接口,第1张

将java.lang.reflect.Method强制转换为功能接口

如果您对在幕后使用反射感到满意,只是不喜欢

try
/
catch
周围的/
invoke
,则可以制作一个简单的实用函数,例如:

public static <T> Consumer<T> toConsumer(Object annotated, Method m) {    return param -> {        try { m.invoke(annotated, param);        } catch (IllegalAccessException | InvocationTargetException e) { throw new RuntimeException(e);        }    };}

这将为您提供所需的确切语法:

CALLBACKS_MAPPER.registerCallback(toConsumer(annotated, method));

但是,如果您想完全避免反射,可以使用

Lambdametafactory
创建一个
Consumer

static Consumer<String> toConsumer(MethodHandles.Lookup lookup, Object annotated, Method method) throws Throwable {    MethodType consumeString = MethodType.methodType(void.class, String.class);    MethodHandle handle = lookup.unreflect(method);    final CallSite site = Lambdametafactory.metafactory(lookup, "accept", MethodType.methodType(Consumer.class, annotated.getClass()), consumeString.changeParameterType(0, Object.class), handle, consumeString);    return (Consumer<String>) site.getTarget().invoke(annotated);}

更改

String
为您的回调应接受的内容。然后:

CALLBACKS_MAPPER.registerCallback(toConsumer(MethodHandles.lookup(), annotated, method));

当然,这里唯一合适的解决方案是重构代码以使用已知的回调接口,在该接口上通常可以调用定义的方法,而不用传递

Method
s。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5506495.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-13
下一篇 2022-12-13

发表评论

登录后才能评论

评论列表(0条)

保存