public static String[] getLambdaParameterNames(Serializable lambda) { Method lambdaMethod = getLambdaMethod(lambda); Class<?>[] lambdaTypes = lambdaMethod.getParameterTypes(); String[] names = getMethodParameterNames(lambdaMethod); List<Method> methods = U.list(); for (Class<?> interf : lambda.getClass().getInterfaces()) { for (Method m : interf.getMethods()) { Class<?>[] types = m.getParameterTypes(); if (types.length <= names.length) { int diff = names.length - types.length; boolean matching = true; for (int i = 0; i < types.length; i++) { if (!types[i].isAssignableFrom(lambdaTypes[i + diff])) { matching = false; } } if (matching) { methods.add(m); } } } } U.must(methods.size() > 0, "Cannot find the lambda target method of the functional interface!"); U.must(methods.size() == 1, "Found more than one lambda target method of the functional interface: " + methods); return Arr.sub(names, names.length - methods.get(0).getParameterTypes().length, names.length); }
public NParamMethodHandler(FastHttp http, HttpRoutes routes, RouteOptions options, Method method, NParamLambda lambda) { super(http, options); this.method = method; Class<?>[] paramTypes = method.getParameterTypes(); String[] paramNames; if (lambda != null) { paramNames = Cls.getLambdaParameterNames(lambda); paramTypes = Arr.sub(paramTypes, paramTypes.length - paramNames.length, paramTypes.length); } else { paramNames = Cls.getMethodParameterNames(method); } Annotation[][] annotations = method.getParameterAnnotations(); this.paramRetrievers = new ParamRetriever[paramTypes.length]; String par = ""; for (int i = 0; i < paramRetrievers.length; i++) { paramRetrievers[i] = ParamRetrievers.createParamRetriever(routes.custom(), paramTypes[i], paramNames[i], annotations[i]); if (i > 0) { par += ", "; } par += paramTypes[i].getSimpleName() + " " + paramNames[i]; } paramsAsStr = "(" + par + ")"; }
public NParamMethodHandler(FastHttp http, HttpRoutes routes, RouteOptions options, Method method, NParamLambda lambda) { super(http, options); this.method = method; Class<?>[] paramTypes = method.getParameterTypes(); String[] paramNames; if (lambda != null) { paramNames = Cls.getLambdaParameterNames(lambda); paramTypes = Arr.sub(paramTypes, paramTypes.length - paramNames.length, paramTypes.length); } else { paramNames = Cls.getMethodParameterNames(method); } Annotation[][] annotations = method.getParameterAnnotations(); this.paramRetrievers = new ParamRetriever[paramTypes.length]; String par = ""; for (int i = 0; i < paramRetrievers.length; i++) { paramRetrievers[i] = ParamRetrievers.createParamRetriever(routes.custom(), paramTypes[i], paramNames[i], annotations[i]); if (i > 0) { par += ", "; } par += paramTypes[i].getSimpleName() + " " + paramNames[i]; } paramsAsStr = "(" + par + ")"; }