/** Basic parameter collection with pulling inherited cascade chaining. */ public List<Object> collectParamaters(Object base, Object[] params) throws Throwable { parameters.clear(); for (int i = 0; i < getLastParameterIndex(); i++) parameters.add(coerceToType(params[i], getParameterTypes()[i])); return parameters; }
/** Pull the cascade inheritance chain for parameter collection. * Applies the varargs collection of parameters supplied as an array or * as separate args. * {@inheritDoc} */ @Override public List<Object> collectParamaters(Object base, Object[] params) throws Throwable { super.collectParamaters(base, params); if (isVarArgs()) { if (getLastParameterIndex() < params.length) { Object[] varargs; if (getParameterCount() == params.length && params[getLastParameterIndex()] instanceof Object[]) varargs = (Object[]) params[getLastParameterIndex()]; else varargs = Arrays.copyOfRange( params, getLastParameterIndex(), params.length); for (int i = 0; i < varargs.length; i++) parameters.add(super.coerceToType( varargs[i], getVarArgsComponentType())); } } else if (null != params && getLastParameterIndex() < params.length) parameters.add(super.coerceToType(params[getLastParameterIndex()], getParameterTypes()[getLastParameterIndex()])); return parameters; } }
/** Specialty invoke for field access invocable types. * Based on arguments supplied infer get or set operation. * {@inheritDoc} */ @Override public synchronized Object invoke(Object base, Object... pars) throws InvocationTargetException { try { if (0 == pars.length) { // getter if (isStatic()) return Primitive.wrap( getMethodHandle().invoke(), getReturnType()); return Primitive.wrap( getMethodHandle().invoke(base), getReturnType()); } else { // setter if (isStatic()) return getSetterHandle().invoke(super.coerceToType( pars[0], getParameterTypes()[0])); return getSetterHandle().invoke(base, super.coerceToType( pars[0], getParameterTypes()[0])); } } catch (Throwable ite) { throw new InvocationTargetException(ite.getCause()); } }