런타임시 biPredicate로 사용할 함수 이름을 수신합니다. 이 biPredicate를 전달하고 평가하기 위해 기본적으로 필터를 사용하여 결과를 얻고 싶습니다. 다음은 biPredicates를 정의하는 유틸리티입니다. 나는 MethodHandle과 Lambda 함수를 사용해 보았습니다. 내가다른 함수에 술어로 함수를 전달하는 방법, RunTime에 술어 함수의 이름을받을 때?
new FilterUtility().execute("genericFilter");
을 사용하면 내가 다음에 실행의 구현을 변경할 때 나는 예외를 얻을 해달라고, java.lang.AbstractMethodError
public class FilterUtility {
public void execute(String filterName) throws Throwable {
ActualBean beanObject = ActualBean.builder().param1("true").param2("false").build();
MethodType methodType = MethodType.methodType(boolean.class, Object.class, Object.class);
MethodHandles.Lookup lookup = MethodHandles.lookup();
MethodHandle handle = lookup.findStatic(FilterUtility.class, filterName, methodType);
BiPredicate<Object, Object> f = (BiPredicate<Object, Object>) LambdaMetafactory.metafactory(lookup,
"test",
MethodType.methodType(BiPredicate.class),
methodType.generic(),
handle,
methodType)
.getTarget()
.invokeExact();
resolve(beanObject, new HashMap<>(), f);
}
public static <SourceObject, TemplateObject> Map<String, String> resolve(SourceObject src,
TemplateObject template,
BiPredicate<SourceObject, TemplateObject> p) {
if (p.test(src, template))
return new HashMap<>();
return null;
}
public static <SourceObject, TemplateObject> boolean genericFilter(SourceObject x, TemplateObject y) {
ObjectMapper ob = new ObjectMapper();
Map<String, Object> source = ob.convertValue(x, Map.class);
Map<String, Object> template = ob.convertValue(y, Map.class);
for (Map.Entry<String, Object> entry : template.entrySet()) {
if (!source.get(entry.getKey()).equals(entry.getValue()))
return false;
}
return true;
}
}
를 얻을.
public void execute(String filterName) throws Throwable {
ActualBean beanObject = ActualBean.builder().param1("true").param2("false").build();
resolve(beanObject, new HashMap<>(), FilterUtility::genericFilter); }
이 제가 이름을 가진 기능을 찾아서 biPredicate로 보내려고하고있는 방법에 문제가 있다고 생각합니다.
제가 은'MethodHandle 핸들 lookup.findStatic (FilterUtility.class, FILTERNAME, methodType는) = 중지 디버거를 사용 , String>()); ' ** 그것은 java.lang.UnsupportedOperationException을 제공합니다. 메시지 : MethodHandle.invoke는 반사적으로 호출 할 수 없습니다 ** –
12 행의'.generic()을 제거하십시오. –