很难找到该主题的任何线索.我只能找到有关将一个功能接口转换为另一个功能接口的问题,以及一些有关Java中类型转换的文章.不是我要找的东西.
This的问题是关于转换lambda→方法,我想相反,将Method转换为任何功能接口,例如,转换为Consumer.
我发现的方法是围绕Method#invoke方法创建一个lambda适配器:
public void registerCallbacks(final Object annotated) {
Class clazz = annotated.getClass();
for (Method method : clazz.getDeclaredMethods()) {
if (method.isAnnotationPresent(Callback.class)) {
Callback registration = method.getAnnotation(Callback.class);
List warnings = new ArrayList<>(3);
if (!Modifier.isPublic(method.getModifiers()))
warnings.add(String.format("Method %s must be public", method));
if (method.getParameterCount() != 1)
warnings.add(String.format("Method %s must consume only one argument", method));
if (method.getParameterCount() == 1 && !method.getParameterTypes()[0].equals(Integer.class))
warnings.add(String.format("Method %s must consume %s", method, Integer.class));
if (!warnings.isEmpty()) {
warnings.forEach(log::warn);
continue;
}
CALLBACKS_MAPPER.registerCallback((param) -> {
try {
method.invoke(annotated, param);
} catch (IllegalAccessException | InvocationTargetException e) {
// Should not happen due to checks before.
log.warn(String.format("Could not invoke %s on %s with %s", method, annotated, param), e);
}
});
log.info("Registered {} as a callback", method);
}
}
}
但是我想避免写
CALLBACKS_MAPPER.registerCallback((param) -> {
try {
method.invoke(annotated, param);
} catch (IllegalAccessException | InvocationTargetException e) {
// Should not happen due to checks before.
log.warn(String.format("Could not invoke %s on %s with %s", method, annotated, param), e);
}
});
赞成更简单的事情,例如
CALLBACKS_MAPPER.registerCallback(SomeApacheLib.methodToFunction(annotated, method));
?因此,有没有办法将旧的Java 1.1反射库映射到较新的Java 8功能接口,还是我很笨,上面提到的用lambda的解决方案就可以了?