我目前正在使用 Java 反射
我用反射做这件事没有任何问题。我了解到 LambdaMetaFactory 比反射具有更好的性能.. 有关于 getter 和 setter 的示例.. 但是没有像 doSomethig(String a, String b, int c) 这样的多参数化方法的示例;
这是我正在做的反思
@Override public T invokeReturn(final Object instance, final Object... args) throws Exception { try { final Method mtd = this.getMethod(); mtd.setAccessible(getModifierAccessType() != ModifierAccessType.PUBLIC); final Object result = mtd.invoke(instance, args); if (getModifierAccessType() != ModifierAccessType.PUBLIC) { mtd.setAccessible(false); } return (T) result; } catch (final IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) { logger.error("Error while Invoking Method", ex); throw new Exception(ex.getCause()); } }
我想在这里添加另一种支持 LambdaMetaFactory 的方法我正在尝试什么
@Override
public <T> T callReturn(Object instance, Object... args) throws Exception {
try {
if (returnMethod == null) {
final MethodHandles.Lookup lookup = MethodHandles.lookup();
MethodHandle methodHandle = lookup.unreflect(method);
MethodType fncType = this.mtdType();
MethodType type = this.callMethodType();
this.returnMethod = LambdaMetafactory.metafactory(lookup, "call", fncType, type, methodHandle, methodHandle.type()).getTarget();
}
switch (this.fncType()) {
case Function: {
MethodFunction<T> result = (MethodFunction<T>) this.returnMethod.invoke();
return result.call(instance);
}
case FunctionArgs: {
MethodFunctionArgs<T> result = (MethodFunctionArgs<T>) this.returnMethod.invoke();
Object[] invokeParams = this.getInvokeParams(instance, args);
return result.call(invokeParams);
}
case Void: {
final VoidFunction result = (VoidFunction) this.returnMethod.invoke();
result.call(instance);
return null;
}
default: {
final VoidFunctionArgs result = (VoidFunctionArgs) this.returnMethod.invoke();
result.call(instance);
return null;
}
}
} catch (Throwable ex) {
throw new Exception(ex);
}
}
没有参数我在 switch case default 和 Function 上没有任何问题,但是有参数我无法运行它这是我的 MethodFunctionArgs @FunctionalInterfaces
@FunctionalInterface
public interface MethodFunctionArgs<T> {
T call(Object... params) ;
///tried too no success
//T call(Object instance, Object... params) ;
//VoidFunctionArgs
///void call(Object instance, Object... params);
}
无论如何要这样做?没有很多示例或教程,只有 getter 和 setter 也许有一种方法可以使用 varags 创建动态 @functionalinterface?
谢谢你的帮助...