Utility class for working with Java types : Type « Reflection « Java






Utility class for working with Java types

        

/*
 * Copyright 2010-2011 Kevin Seim
 * 
 * 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.
 */
//package org.beanio.util;

import java.math.*;
import java.util.*;

/**
 * Utility class for working with Java types supported by BeanIO.
 * 
 * @author Kevin Seim
 * @since 1.0
 */
public class TypeUtil {

    /** 
     * Alias for a <tt>java.util.Date</tt> that includes both date and time information.
     * If a type handler is registered using this alias, the registered type handler will
     * become the default type handler for all <tt>Date</tt> classes.
     */
    public static final String DATETIME_ALIAS = "datetime";
    /** Alias for the <tt>java.util.Date</tt> class that includes only date information */
    public static final String DATE_ALIAS = "date";
    /** Alias for a <tt>java.util.Date</tt> that only includes only time information */
    public static final String TIME_ALIAS = "time";
    
    /** Class type used to indicate a Java array */
    public static final Class<? extends Collection<Object>> ARRAY_TYPE = ArrayCollection.class;
    
    /**
     * Cannot instantiate.
     */
    private TypeUtil() { }
    
    /**
     * Returns <tt>true</tt> if <tt>to.isAssignableFrom(from)</tt> after converting
     * primitive values of <tt>to</tt> to its object counterpart.
     * @param to the class or primitive to test assignability to
     * @param from the class to test assignability from
     * @return <tt>true</tt> if <tt>to</tt> is assignable from <tt>from</tt>
     */
    public static boolean isAssignable(Class<?> to, Class<?> from) {
        return toWrapperClass(to).isAssignableFrom(from);
    }
    
    /**
     * Converts primitive types to their wrapper counterparts. 
     * @param type the class type to convert
     * @return the wrapper equivalent for the primitive type, or if <tt>type</tt>
     *   was not a primitive, its returned as is
     */
    public static Class<?> toWrapperClass(Class<?> type) {
        if (!type.isPrimitive())
            return type;
        else if (int.class.equals(type))
            return Integer.class;
        else if (double.class.equals(type))
            return Double.class;
        else if (char.class.equals(type))
            return Character.class;
        else if (boolean.class.equals(type))
            return Boolean.class;
        else if (long.class.equals(type))
            return Long.class;
        else if (float.class.equals(type))
            return Float.class;
        else if (short.class.equals(type))
            return Short.class;
        else if (byte.class.equals(type))
            return Byte.class;
        else
            throw new IllegalArgumentException("Primitive type not supported: " + type.getName());
    }
    
    /**
     * Returns the <tt>Class</tt> object for a class name or type alias.  A type alias is not
     * case sensitive.  The following type aliases are supported:
     * <table>
     * <tr><th>Alias</th><th>Class or Primitive</th></tr>
     * <tr><td>string</td><td>java.lang.String</td></tr>
     * <tr><td>boolean</td><td>java.lang.Boolean</td></tr>
     * <tr><td>byte</td><td>java.lang.Byte</td></tr>
     * <tr><td>int</td><td>java.lang.Integer</td></tr>
     * <tr><td>integer</td><td>java.lang.Integer</td></tr>
     * <tr><td>short</td><td>java.lang.Short<</td></tr>
     * <tr><td>char</td><td>java.lang.Character</td></tr>
     * <tr><td>character</td><td>java.lang.Character</td></tr>
     * <tr><td>long</td><td>java.lang.Long</td></tr>
     * <tr><td>float</td><td>java.lang.Float</td></tr>
     * <tr><td>double</td><td>java.lang.Double</td></tr>
     * <tr><td>bigdecimal</td><td>java.math.BigDecimal</td></tr>
     * <tr><td>decimal</td><td>java.math.BigDecimal</td></tr>
     * <tr><td>biginteger</td><td>java.math.BigInteger</td></tr>
     * <tr><td>date</td><td>java.util.Date</td></tr>
     * <tr><td>time</td><td>java.util.Date</td></tr>
     * <tr><td>datetime</td><td>java.util.Date</td></tr></tr>
     * </table>
     * 
     * @param type the fully qualified class name or type alias
     * @return the class, or null if the type name is invalid
     */
    public static Class<?> toType(String type) {
        if ("string".equalsIgnoreCase(type))
            return String.class;
        else if ("boolean".equalsIgnoreCase(type))
            return Boolean.class;
        else if ("byte".equalsIgnoreCase(type))
            return Byte.class;
        else if ("char".equalsIgnoreCase(type))
            return Character.class;
        else if ("character".equalsIgnoreCase(type))
            return Character.class;
        else if ("short".equalsIgnoreCase(type))
            return Short.class;
        else if ("int".equalsIgnoreCase(type))
            return Integer.class;
        else if ("Integer".equalsIgnoreCase(type))
            return Integer.class;
        else if ("long".equalsIgnoreCase(type))
            return Long.class;
        else if ("float".equalsIgnoreCase(type))
            return Float.class;
        else if ("double".equalsIgnoreCase(type))
            return Double.class;
        else if ("bigdecimal".equalsIgnoreCase(type))
            return BigDecimal.class;
        else if ("decimal".equalsIgnoreCase(type))
            return BigDecimal.class;
        else if ("biginteger".equalsIgnoreCase(type))
            return BigInteger.class;
        else if (
            DATE_ALIAS.equalsIgnoreCase(type) ||
            TIME_ALIAS.equalsIgnoreCase(type) ||
            DATETIME_ALIAS.equalsIgnoreCase(type))
            return Date.class;
        
        try {
            return Class.forName(type);
        }
        catch (ClassNotFoundException e) {
            return null;
        }
    }
    
    /**
     * Returns <tt>true</tt> if the type alias is not used to register a
     * type handler for its associated class.
     * @param alias the type alias to check
     * @return <tt>true</tt> if the type alias is only an alias
     */
    public static boolean isAliasOnly(String alias) {
        return DATE_ALIAS.equalsIgnoreCase(alias) || TIME_ALIAS.equalsIgnoreCase(alias);
    }
    
    /**
     * Returns the collection <tt>Class</tt> object for a collection class name or type alias.  
     * A type alias is not case sensitive.  The following collection type aliases are supported:
     * <table>
     * <tr><th>Alias</th><th>Class or Primitive</th></tr>
     * <tr><td>array</td><td>Java Array</td></tr>
     * <tr><td>list</td><td>java.util.ArrayList</td></tr>
     * <tr><td>set</td><td>java.util.HashSet</td></tr>
     * </table>
     * 
     * @param type the fully qualified class name or type alias of the collection
     * @return the collection class, or {@link #ARRAY_TYPE} for array, 
     *   or <tt>null</tt> if the type name is invalid
     */
    @SuppressWarnings("unchecked")
    public static Class<? extends Collection<Object>> toCollectionType(String type) {
        if ("array".equalsIgnoreCase(type))
            return ARRAY_TYPE;
        else if ("collection".equalsIgnoreCase(type))
            return (Class<? extends Collection<Object>>)(Class<?>) Collection.class;
        else if ("list".equalsIgnoreCase(type))
            return (Class<? extends Collection<Object>>)(Class<?>) List.class;
        else if ("set".equalsIgnoreCase(type))
            return (Class<? extends Collection<Object>>)(Class<?>) Set.class;
        
        try {
            Class<?> clazz = Class.forName(type);
            if (!Collection.class.isAssignableFrom(clazz)) {
                return null;
            }
            return (Class<? extends Collection<Object>>) clazz;
        }
        catch (ClassNotFoundException ex) {
            return null;
        }
    }
    
    private static interface ArrayCollection extends Collection<Object> { }
}

   
    
    
    
    
    
    
    
  








Related examples in the same category

1.Returns true if type is a iterable type
2.Returns an array of Type objects representing the actual type arguments to targetType used by clazz
3.TYPE Utilities
4.Data type utilities
5.Is Type Compatible
6.Get Raw Class
7.isTypeOf
8.Is the given {@code object} a primitive type or wrapper for a primitive type?
9.is Primitive type, get Primitive Class, get Type Default Value
10.Returns the class defined for the type variable
11.Get Actual Class