List of usage examples for java.lang.reflect Method isVarArgs
@Override public boolean isVarArgs()
From source file:Main.java
public static void printMethods(Class cl) { Method[] methods = cl.getDeclaredMethods(); for (int i = 0; i < methods.length; i++) { Method m = methods[i]; System.out.println(m.isVarArgs()); }//from ww w.j a v a 2s . c o m }
From source file:com.evolveum.midpoint.util.ReflectionUtil.java
public static Method findVarArgsMethod(Object object, String methodName) { for (Method method : object.getClass().getMethods()) { if (method.getName().equals(methodName) && method.isVarArgs()) { return method; }/*from w w w.ja v a 2 s . c o m*/ } return null; }
From source file:com.arpnetworking.jackson.BuilderDeserializer.java
static boolean isSetterMethod(final Class<?> builderClass, final Method method) { return method.getName().startsWith(SETTER_PREFIX) && builderClass.equals(method.getReturnType()) && !method.isVarArgs() && method.getParameterTypes().length == 1; }
From source file:com.evolveum.midpoint.util.ReflectionUtil.java
public static Method findMethod(Object object, String methodName, int arity) { for (Method method : object.getClass().getMethods()) { if (method.getName().equals(methodName) && method.getParameterTypes().length == arity && !method.isVarArgs()) { return method; }/*from w w w . j ava 2 s .c om*/ } return null; }
From source file:org.protelis.lang.util.ReflectionUtils.java
private static boolean compatibleLength(final Method m, final Object[] args) { if (m.isVarArgs()) { return args.length >= (m.getParameterTypes().length - 1); } else {/*from w ww .j av a 2 s . c o m*/ return m.getParameterTypes().length == args.length; } }
From source file:org.protelis.lang.util.ReflectionUtils.java
private static Object[] repackageIfVarArgs(final Method m, final Object[] args) { if (!m.isVarArgs()) { return args; } else {/*from www. j a va 2 s . co m*/ final Class<?>[] expectedArgs = m.getParameterTypes(); // We will repackage into an array of the expected length final Object[] newargs = new Object[expectedArgs.length]; // repackage all the base args System.arraycopy(args, 0, newargs, 0, Math.max(expectedArgs.length - 1, 0)); // Determine how many arguments need repackaging final int numVarArgs = args.length - (expectedArgs.length - 1); // Make an array of the appropriate type, then fill it in final Class<?> varargType = expectedArgs[expectedArgs.length - 1]; Object[] vararg = (Object[]) Array.newInstance(varargType.getComponentType(), numVarArgs); for (int i = 0; i < numVarArgs; i++) { vararg[i] = args[i + expectedArgs.length - 1]; } // Put the new array in the last argument and return newargs[newargs.length - 1] = vararg; return newargs; } }
From source file:org.protelis.lang.util.ReflectionUtils.java
private static Class<?> nthArgumentType(final Method m, final int n) { final Class<?>[] expectedArgs = m.getParameterTypes(); if (m.isVarArgs() && n >= (expectedArgs.length - 1)) { final Class<?> varargType = expectedArgs[expectedArgs.length - 1]; return varargType.getComponentType(); } else {/*from ww w .ja va 2 s . c o m*/ return expectedArgs[n]; } }
From source file:com.evolveum.midpoint.util.ReflectionUtil.java
public static Object invokeMethod(Object object, String methodName, List<?> argList) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { Method method = findMethod(object, methodName, argList); if (method == null) { throw new NoSuchMethodException( "No method " + methodName + " for arguments " + debugDumpArgList(argList) + " in " + object); }//from www . j a v a 2 s .c o m Object[] args = argList.toArray(); if (method.isVarArgs()) { Class<?> parameterTypeClass = method.getParameterTypes()[0]; Object[] varArgs = (Object[]) Array.newInstance(parameterTypeClass.getComponentType(), args.length); for (int i = 0; i < args.length; i++) { varArgs[i] = args[i]; } args = new Object[] { varArgs }; } try { return method.invoke(object, args); } catch (IllegalArgumentException e) { throw new IllegalArgumentException( e.getMessage() + " for arguments " + debugDumpArgList(argList) + " in " + object, e); } }
From source file:com.github.michalbednarski.intentslab.editor.BundleAdapter.java
public static void putInBundle(Bundle bundle, String key, Object value) { if (value == null) { bundle.putString(key, null);//from w w w.ja v a2s.com return; } Pattern putMethodName = Pattern.compile("put[A-Z][A-Za-z]+"); for (Method method : Bundle.class.getMethods()) { if (putMethodName.matcher(method.getName()).matches() && !method.isVarArgs()) { final Class<?>[] parameterTypes = method.getParameterTypes(); if (parameterTypes.length == 2 && parameterTypes[0] == String.class && Utils.toWrapperClass(parameterTypes[1]).isInstance(value)) { try { method.invoke(bundle, key, value); return; } catch (IllegalAccessException e) { e.printStackTrace(); // continue } catch (InvocationTargetException e) { throw new RuntimeException("Method " + method.getName() + " of bundle thrown exception", e); } } } } throw new RuntimeException("No put* method found"); }
From source file:io.github.wysohn.triggerreactor.tools.ReflectionUtil.java
@SuppressWarnings({ "unchecked", "unchecked" }) public static Object invokeMethod(Class<?> clazz, Object obj, String methodName, Object... args) throws NoSuchMethodException, IllegalArgumentException, InvocationTargetException, IllegalAccessException {/*from w w w .ja va 2s. com*/ try { List<Method> validMethods = new ArrayList<>(); for (Method method : clazz.getMethods()) { Class<?>[] parameterTypes = null; if (!method.getName().equals(methodName)) { continue; } parameterTypes = method.getParameterTypes(); if (method.isVarArgs()) { if (method.isVarArgs() && (parameterTypes.length - args.length >= 2)) { parameterTypes = null; continue; } } else { if (parameterTypes.length != args.length) { parameterTypes = null; continue; } } if (method.isVarArgs()) { boolean matches = false; // check non vararg part for (int i = 0; i < parameterTypes.length - 1; i++) { matches = checkMatch(parameterTypes[i], args[i]); if (!matches) break; } // check rest for (int i = parameterTypes.length - 1; i < args.length; i++) { Class<?> arrayType = parameterTypes[parameterTypes.length - 1].getComponentType(); matches = checkMatch(arrayType, args[i]); if (!matches) break; } if (matches) { validMethods.add(method); } } else { boolean matches = true; for (int i = 0; i < parameterTypes.length; i++) { matches = checkMatch(parameterTypes[i], args[i]); if (!matches) break; } if (matches) { validMethods.add(method); } } } if (!validMethods.isEmpty()) { Method method = validMethods.get(0); for (int i = 1; i < validMethods.size(); i++) { Method targetMethod = validMethods.get(i); Class<?>[] currentParams = method.getParameterTypes(); Class<?>[] targetParams = targetMethod.getParameterTypes(); if (method.isVarArgs() && targetMethod.isVarArgs()) { for (int j = 0; j < currentParams.length; j++) { if (currentParams[j].isAssignableFrom(targetParams[j])) { method = targetMethod; break; } } } else if (method.isVarArgs()) { //usually, non-vararg is more specific method. So we use that method = targetMethod; } else if (targetMethod.isVarArgs()) { //do nothing } else { for (int j = 0; j < currentParams.length; j++) { if (targetParams[j].isEnum()) { // enum will be handled later method = targetMethod; break; } else if (ClassUtils.isAssignable(targetParams[j], currentParams[j], true)) { //narrow down to find the most specific method method = targetMethod; break; } } } } method.setAccessible(true); for (int i = 0; i < args.length; i++) { Class<?>[] parameterTypes = method.getParameterTypes(); if (args[i] instanceof String && i < parameterTypes.length && parameterTypes[i].isEnum()) { try { args[i] = Enum.valueOf((Class<? extends Enum>) parameterTypes[i], (String) args[i]); } catch (IllegalArgumentException ex1) { // Some overloaded methods already has // String to Enum conversion // So just lets see if one exists Class<?>[] types = new Class<?>[args.length]; for (int k = 0; k < args.length; k++) types[k] = args[k].getClass(); try { Method alternative = clazz.getMethod(methodName, types); return alternative.invoke(obj, args); } catch (NoSuchMethodException ex2) { throw new RuntimeException( "Tried to convert value [" + args[i] + "] to Enum [" + parameterTypes[i] + "] or find appropriate method but found nothing. Make sure" + " that the value [" + args[i] + "] matches exactly with one of the Enums in [" + parameterTypes[i] + "] or the method you are looking exists."); } } } } if (method.isVarArgs()) { Class<?>[] parameterTypes = method.getParameterTypes(); Object varargs = Array.newInstance(parameterTypes[parameterTypes.length - 1].getComponentType(), args.length - parameterTypes.length + 1); for (int k = 0; k < Array.getLength(varargs); k++) { Array.set(varargs, k, args[parameterTypes.length - 1 + k]); } Object[] newArgs = new Object[parameterTypes.length]; for (int k = 0; k < newArgs.length - 1; k++) { newArgs[k] = args[k]; } newArgs[newArgs.length - 1] = varargs; args = newArgs; } return method.invoke(obj, args); } if (args.length > 0) { StringBuilder builder = new StringBuilder(String.valueOf(args[0].getClass().getSimpleName())); for (int i = 1; i < args.length; i++) { builder.append(", " + args[i].getClass().getSimpleName()); } throw new NoSuchMethodException(methodName + "(" + builder.toString() + ")"); } else { throw new NoSuchMethodException(methodName + "()"); } } catch (NullPointerException e) { StringBuilder builder = new StringBuilder(String.valueOf(args[0])); for (int i = 1; i < args.length; i++) builder.append("," + String.valueOf(args[i])); throw new NullPointerException("Call " + methodName + "(" + builder.toString() + ")"); } }