Java Reflection Assignable isAssignable(Class lhsType, Class rhsType)

Here you can find the source of isAssignable(Class lhsType, Class rhsType)

Description

Check if the right-hand side type may be assigned to the left-hand side type, assuming setting by reflection.

License

Apache License

Parameter

Parameter Description
lhsType the target type
rhsType the value type that should be assigned to the target type

Return

if the target type is assignable from the value type

Declaration

public static boolean isAssignable(Class<?> lhsType, Class<?> rhsType) 

Method Source Code

//package com.java2s;
/**/* ww  w. j  ava  2  s  .  c  o m*/
 * Copyright 2008-2016 Juho Jeong
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import java.util.HashMap;
import java.util.Map;

public class Main {
    /**
     * Map with primitive type as key and corresponding wrapper type as value,
     * for example: int.class -> Integer.class.
     */
    private static final Map<Class<?>, Class<?>> primitiveTypeToWrapperMap = new HashMap<>(17);

    /**
     * Check if the right-hand side type may be assigned to the left-hand side
     * type, assuming setting by reflection. Considers primitive wrapper
     * classes as assignable to the corresponding primitive types.
     * @param lhsType the target type
     * @param rhsType the value type that should be assigned to the target type
     * @return if the target type is assignable from the value type
     */
    public static boolean isAssignable(Class<?> lhsType, Class<?> rhsType) {
        if (rhsType == null) {
            if (!lhsType.isPrimitive())
                return true;
        } else {
            if (lhsType.isAssignableFrom(rhsType))
                return true;

            if (rhsType.isPrimitive() && lhsType.equals(getPrimitiveWrapper(rhsType)))
                return true;

            if (lhsType.isPrimitive() && rhsType.equals(getPrimitiveWrapper(lhsType)))
                return true;

            if (lhsType.isArray() && rhsType.isArray()) {
                if (rhsType.getComponentType().isPrimitive() && lhsType.equals(getPrimitiveWrapper(rhsType)))
                    return true;

                if (lhsType.getComponentType().isPrimitive() && rhsType.equals(getPrimitiveWrapper(lhsType)))
                    return true;
            }
        }

        return false;
    }

    /**
     * Gets the wrapper object class for the given primitive type class.
     * For example, passing <code>boolean.class</code> returns <code>Boolean.class</code>
     *
     * @param primitiveType the primitive type class for which a match is to be found
     * @return the wrapper type associated with the given primitive or null if no match is found
     */
    public static Class<?> getPrimitiveWrapper(Class<?> primitiveType) {
        return primitiveTypeToWrapperMap.get(primitiveType);
    }
}

Related

  1. isAssignable(Class clazz, Class toClass)
  2. isAssignable(Class lhsType, Class rhsType)
  3. isAssignable(Class cls, final Class toClass)
  4. isAssignable(Class lhsType, Class rhsType)
  5. isAssignable(Class lhsType, Class rhsType)
  6. isAssignable(final Class from, final Class to)
  7. isAssignableFrom(Class class1, Class class2)
  8. isAssignableFrom(Class to, Class from)
  9. isAssignableFrom(Class to, Class from)