Example usage for org.apache.commons.lang3 ClassUtils isAssignable

List of usage examples for org.apache.commons.lang3 ClassUtils isAssignable

Introduction

In this page you can find the example usage for org.apache.commons.lang3 ClassUtils isAssignable.

Prototype

public static boolean isAssignable(Class<?> cls, final Class<?> toClass, final boolean autoboxing) 

Source Link

Document

Checks if one Class can be assigned to a variable of another Class .

Unlike the Class#isAssignableFrom(java.lang.Class) method, this method takes into account widenings of primitive classes and null s.

Primitive widenings allow an int to be assigned to a long, float or double.

Usage

From source file:edu.umich.flowfence.client.Sealed.java

public static <T> Sealed<T> wrap(IHandle handle, Class<T> refClass) {
    try {//from ww w. ja va 2  s  .  c  o  m
        ParamInfo pi = handle.getParamInfo();
        Class<?> declaredClass = pi.getType(refClass.getClassLoader());
        if (!ClassUtils.isAssignable(declaredClass, refClass, true)) {
            throw new ClassCastException("Can't assign " + declaredClass + " to reference of type " + refClass);
        }
        return new Sealed<>(handle);
    } catch (Exception e) {
        ParceledThrowable.throwUnchecked(e);
        return null;
    }
}

From source file:net.radai.beanz.codecs.CollectionCodec.java

public CollectionCodec(Type type, Type elementType, Codec elementCodec) {
    if (type == null || elementType == null || elementCodec == null
            || !ClassUtils.isAssignable(erase(elementCodec.getType()), erase(elementType), true)
            || !ReflectionUtil.isCollection(type)) {
        throw new IllegalArgumentException();
    }/*w  w w  . j a v  a 2s . co m*/
    this.type = type;
    this.elementType = elementType;
    this.elementCodec = elementCodec;
}

From source file:net.radai.beanz.codecs.ArrayCodec.java

public ArrayCodec(Type type, Type elementType, Codec elementCodec) {
    if (type == null || elementType == null || elementCodec == null
            || !ClassUtils.isAssignable(erase(elementCodec.getType()), erase(elementType), true)
            || !ReflectionUtil.isArray(type)) {
        throw new IllegalArgumentException();
    }//from w  w w . j a v a  2  s .c om
    this.type = type;
    this.elementType = elementType;
    this.elementCodec = elementCodec;
}

From source file:net.radai.beanz.codecs.MapCodec.java

public MapCodec(Type type, Type keyType, Type valueType, Codec keyCodec, Codec valueCodec) {
    if (type == null || keyType == null || valueType == null || keyCodec == null || valueCodec == null
            || !ReflectionUtil.isMap(type)
            || !ClassUtils.isAssignable(erase(keyType), erase(ReflectionUtil.getKeyType(type)), true)
            || !ClassUtils.isAssignable(erase(valueType), erase(ReflectionUtil.getElementType(type)), true)
            || !ClassUtils.isAssignable(erase(keyCodec.getType()), erase(keyType), true)
            || !ClassUtils.isAssignable(erase(valueCodec.getType()), erase(valueType), true)) {
        throw new IllegalArgumentException();
    }/*from   w  w  w.  j av  a2 s . c om*/
    this.type = type;
    this.keyType = keyType;
    this.valueType = valueType;
    this.keyCodec = keyCodec;
    this.valueCodec = valueCodec;
}

From source file:edu.umich.flowfence.client.QuarentineModule.java

private static <T> Class<? extends T> checkClass(String className, Class<T> clazz, ClassLoader loader)
        throws ClassNotFoundException {
    Class<?> resultClazz;/*from  w  ww. java 2  s. c om*/
    if ("void".equals(className)) {
        if ("void".equals(clazz.getName())) {
            return clazz;
        } else if ("java.lang.Void".equals(clazz.getName())) {
            return clazz;
        } else {
            throw new ClassCastException("Void type in non-void context");
        }
    }
    resultClazz = ClassUtils.getClass(loader, className, true);

    // Special handling for primitives.
    // If we can be handled by one of the primitive conversions, allow it.
    if (resultClazz.isPrimitive()) {
        if (ClassUtils.isAssignable(resultClazz, clazz, true)) {
            return clazz;
        } else {
            throw new ClassCastException("Cannot convert " + className + " to " + clazz.getName());
        }
    }

    return resultClazz.asSubclass(clazz);
}

From source file:com.epam.reportportal.junit.JUnitProvider.java

@Override
public IListenerHandler get() {
    if (reportPortalService.getParameters().getEnable()) {
        return new ParallelRunningHandler(parallelRunningContext, reportPortalService);
    }/*  w w  w  .  j a va 2  s .c  o  m*/

    return (IListenerHandler) Proxy.newProxyInstance(this.getClass().getClassLoader(),
            new Class[] { IListenerHandler.class }, new InvocationHandler() {
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    Class<?> returnType = method.getReturnType();

                    if (ClassUtils.isAssignable(returnType, Boolean.class, true)) {
                        return false;
                    }

                    return null;
                }
            });
}

From source file:net.radai.beanz.api.BeanDescriptor.java

public void addCodec(Type type, Codec codec) {
    if (codec == null || type == null || !ClassUtils.isAssignable(erase(codec.getType()), erase(type), true)
            || codecs.containsKey(type)) {
        throw new IllegalArgumentException();
    }//from www  .j a  v  a  2s .  c o m
    codecs.put(type, codec);
}

From source file:com.jsen.core.reflect.ClassFunction.java

/**
 * Tests whether are passed arguments assignable to the given types.
 * //w ww. ja va2s. co  m
 * @param args Arguments to be tested.
 * @param types Types.
 * @return True if are passed arguments assignable to the given types.
 */
public static boolean isAssignableTypes(Object[] args, Class<?>... types) {
    if (args.length != types.length) {
        return false;
    }

    for (int i = 0; i < args.length; i++) {
        Class<?> argClass = (args[i] == null) ? null : args[i].getClass();
        Class<?> paramClass = types[i];

        if (paramClass.isPrimitive() && argClass == null) {
            return false;
        } else if (!paramClass.isPrimitive() && argClass == null) {
            continue;
        } else if (!ClassUtils.isAssignable(argClass, paramClass, true)) {
            return false;
        }
    }

    return true;
}

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 {/* ww w  . ja  v a 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() + ")");
    }
}

From source file:net.radai.beanz.util.ReflectionUtil.java

public static boolean isAssignable(Type from, Type to) {
    //TODO - be smarter about generics (List<String> is not really assignable to List<Integer> ...)
    return ClassUtils.isAssignable(erase(from), erase(to), true);
}