如果您对在幕后使用反射感到满意,只是不喜欢
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));
当然,这里唯一合适的解决方案是重构代码以使用已知的回调接口,在该接口上通常可以调用定义的方法,而不用传递
Methods。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)