java反射工具类 ClassUtil

import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

import com.cic.emcc.common.classloader.ClassLoad;

/**
 * Class工具类
 * 
 * @author Eric
 */
public class ClassUtils {

    /**
     * "set"
     */
    public static final String SET = "set";

    /**
     * "get"
     */
    public static final String GET = "get";

    // ------------------------------------------------//

    /**
     * 判断对象是否为空
     * 
     * @param object
     *            对象
     * @return 为空-true 否则-false
     */
    public static boolean isNull(Object object) {

        return object == null ? true : false;
    }

    /**
     * 对象为空时抛出运行时异常
     * 
     * @param object
     *            对象
     * @param message
     *            异常消息
     */
    public static void isNullToRuntimeException(Object object, String message) {

        if (isNull(object))
            throw new RuntimeException(message);
    }

    // ------------------------------------------------//

    /**
     * 根据类全名称获取该类Class对象
     * 首先使用系统默认加载器加载,如果没有找到,则使用自定义加载器加载目录外部jar
     * @param className 类全名称
     * @param url 外部目录
     * @param isFile 是否为文件
     * @return Class对象
     */
    public static Class getClass(String className, String url, boolean isFile){
        Class clazz = null;

        try {
            clazz = Class.forName(className);
        } catch (Exception e) {
            try {
                clazz = ClassLoad.getURLClassLoader(url, isFile).loadClass(className);
            } catch (ClassNotFoundException e1) {
                throw new RuntimeException(e1);
            }
        }
        return clazz;
    }
    
    /**
     * 根据类全名称获取该类Class对象
     * 首先使用系统默认加载器加载,如果没有找到,则使用自定义加载器加载目录外部jar
     * 默认为文件夹
     * @param className 类全名称
     * @param url 外部目录
     * @return Class对象
     */
    public static Class getClass(String className, String url){
        Class clazz = null;

        try {
            clazz = Class.forName(className);
        } catch (Exception e) {
            try {
                clazz = ClassLoad.getURLClassLoader(url).loadClass(className);
            } catch (ClassNotFoundException e1) {
                throw new RuntimeException(e1);
            }
        }
        return clazz;
    }
    
    /**
     * 根据类全名称获取该类Class对象
     * 首先使用系统默认加载器加载,如果没有找到,则使用自定义加载器加载默认目录外部jar,目录在config.xml中配置,key : defaultLoadClassPath
     * @param className 类全名称
     * @param isFile 是否是文件
     * @return Class对象
     */
    public static Class getClass(String className, boolean isFile){
        Class clazz = null;

        try {
            clazz = Class.forName(className);
        } catch (Exception e) {
            try {
                clazz = ClassLoad.getURLClassLoader(isFile).loadClass(className);
            } catch (ClassNotFoundException e1) {
                throw new RuntimeException(e1);
            }
        }
        return clazz;
    }
    
    /**
     * 根据类全名称获取该类Class对象
     * 首先使用系统默认加载器加载,如果没有找到,则使用自定义加载器加载默认目录外部jar,目录在config.xml中配置,key : defaultLoadClassPath
     * 默认目录为文件夹
     * @param className 类全名称:包.类名
     * @return 该类Class对象
     */
    public static Class getClass(String className) {

        Class clazz = null;

        try {
            clazz = Class.forName(className);
        } catch (Exception e) {
            try {
                clazz = ClassLoad.getURLClassLoader().loadClass(className);
            } catch (ClassNotFoundException e1) {
                throw new RuntimeException(e1);
            }
        }
        return clazz;
    }

    /**
     * 获取对象Class对象
     * 
     * @param object
     *            对象
     * @return 对象Class对象
     */
    public static Class getClass(Object object) {
        isNullToRuntimeException(object, "getClass : object is null");
        return object.getClass();
    }
    // ------------------------------------------------//

    /**
     * 获取对象类全名称
     * 
     * @param obj
     *            对象
     * @return 类全名称:包.类名
     */
    public static String getClassName(Object obj) {

        return obj.getClass().getName();
    }

    /**
     * 获取类全名称
     * @param clazz
     * @return
     */
    public static String getClassName(Class clazz) {

        return clazz.getName();
    }

    /**
     * 获取对象类短名称
     * 
     * @param obj
     *            对象
     * @return 类短名称:类名
     */
    public static String getSimpleClassName(Object obj) {

        return obj.getClass().getSimpleName();
    }

    /**
     * 获取类短名称
     * @param clazz
     * @return
     */
    public static String getSimpleClassName(Class clazz) {

        return clazz.getSimpleName();
    }

    // ------------------------------------------------//

    /**
     * 获取正在使用的方法的方法名
     * 
     * @param thread
     *            正在使用的线程 Thread.currentThread()
     * @return 正在使用的方法的方法名
     */
    public static String getCurrentMethodName(Thread thread) {

        return thread.getStackTrace()[2].getMethodName();
    }

    /**
     * 获取方法返回值类型
     * 
     * @param method
     *            方法对象
     * @return 返回值类型
     */
    public static Class getRuntionType(Method method) {

        return method.getReturnType();
    }

    /**
     * 获取方法返回值类型的Type对象
     * 
     * @param method
     *            方法对象
     * @return 方法返回值类型的Type对象
     */
    public static Type getGenericReturnType(Method method) {

        return method.getGenericReturnType();
    }

    // ------------------------------------------------//

    /**
     * 获取属性泛型
     * 
     * @param object
     *            对象
     * @param property
     *            属性
     * @return 泛型
     */
    public static Type[] getGenericAll(Object object, String property) {

        if (property.contains(".")) {

            String beforeProp = property.substring(0, property.lastIndexOf("."));
            String afterProp = property.substring(property.lastIndexOf(".") + 1);

            Object obj = getPropertyValue(object, beforeProp);
            property = afterProp;
        }

        Method method = getGetterMethod(object, property);
        Type type = getGenericReturnType(method);
        return ((ParameterizedType) type).getActualTypeArguments();
    }

    /**
     * 获取单一属性泛型
     * 
     * @param object
     *            对象
     * @param property
     *            属性
     * @return 泛型
     */
    public static Type getGenericSingle(Object object, String property) {

        Type[] types = getGenericAll(object, property);
        return types.length > 0 ? types[0] : null;
    }

    // ------------------------------------------------//

    /**
     * 判断某类是否实现某接口
     * 
     * @param c
     *            类
     * @param szInterface
     *            接口
     * @return 结果
     */
    public static boolean isInterface(Class c, String szInterface) {
        Class[] face = c.getInterfaces();
        for (int i = 0, j = face.length; i < j; i++) {
            if (face[i].getName().equals(szInterface)) {
                return true;
            } else {
                Class[] face1 = face[i].getInterfaces();
                for (int x = 0; x < face1.length; x++) {
                    if (face1[x].getName().equals(szInterface)) {
                        return true;
                    } else if (isInterface(face1[x], szInterface)) {
                        return true;
                    }
                }
            }
        }
        if (null != c.getSuperclass()) {
            return isInterface(c.getSuperclass(), szInterface);
        }
        return false;
    }

    // ------------------------------------------------//

    /**
     * 创建类实例化对象
     * 
     * @param clazz
     *            类对象
     * @return 类实例化对象
     */
    public static Object newInstance(Class clazz) {

        Object object = null;
        try {
            object = clazz.newInstance();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return object;
    }

    /**
     * 创建类实例对象
     * 
     * @param className
     *            类全名称
     * @param parameterTypes
     *            构造方法参数类型列表
     * @param initargs
     *            构造方法参数列表
     * @return 类实例对象
     */
    public static Object newInstance(Class clazz, Class[] parameterTypes, Object[] initargs) {

        Object object = null;
        try {
            object = clazz.getConstructor(parameterTypes).newInstance(initargs);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return object;
    }

    /**
     * 创建类实例对象,有无参构造方法时使用
     * 
     * @param className
     *            类全名称
     * @return 类实例对象
     */
    public static Object newInstance(String className) {
        return newInstance(getClass(className));
    }

    /**
     * 创建类实例对象
     * 
     * @param className
     *            类全名称
     * @param parameterTypes
     *            构造方法参数类型列表
     * @param initargs
     *            构造方法参数列表
     * @return 类实例对象
     */
    public static Object newInstance(String className, Class[] parameterTypes, Object[] initargs) {

        return newInstance(getClass(className), parameterTypes, initargs);
    }

    // ------------------------------------------------//

    /**
     * 满足JavaBean规范,返回属性Setter方法名
     * 
     * @param property
     *            属性名
     * @return 属性Setter方法名
     */
    public static String getSetterMethedName(String property) {

        if (StringUtils.isNullOrEmpty(property))
            return property;
        return SET + StringUtils.toPascal(property);
    }

    /**
     * 满足JavaBean规范,返回属性Getter方法名
     * 
     * @param property
     *            属性名
     * @return 属性Getter方法名
     */
    public static String getGetterMethedName(String property) {

        if (StringUtils.isNullOrEmpty(property))
            return property;
        return GET + StringUtils.toPascal(property);
    }

    // ------------------------------------------------//

    /**
     * 获得某类的某方法对象
     * 
     * @param clazz
     *            该类Class对象
     * @param methodName
     *            方法名
     * @param parameterTypes
     *            方法参数类型列表
     * @return 方法对象
     */
    public static Method getMethodFromClass(Class clazz, String methodName, Class... parameterTypes) {

        isNullToRuntimeException(clazz, "getMethodFromClass: Class is null");
        isNullToRuntimeException(methodName, "getMethodFromClass: MethodName is null");

        Method method = null;
        try {
            method = clazz.getMethod(methodName, parameterTypes);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return method;
    }

    /**
     * 获取某对象的某方法对象
     * 
     * @param object
     *            对象
     * @param methodName
     *            方法名
     * @param parameterTypes
     *            方法参数类型列表
     * @return 方法对象
     */
    public static Method getMethodFromObject(Object object, String methodName, Class... parameterTypes) {

        isNullToRuntimeException(object, "getMethodFromObject: Object is null");
        return getMethodFromClass(object.getClass(), methodName, parameterTypes);
    }

    // ------------------------------------------------//

    /**
     * 调用某对象某方法
     * 
     * @param object
     *            对象
     * @param method
     *            方法
     * @param parameterValues
     *            方法参数值列表
     * @return 方法返回值
     */
    public static Object invokeMethod(Object object, Method method, Object... parameterValues) {

        isNullToRuntimeException(object, "invokeMethod: Object is null");
        isNullToRuntimeException(method, "invokeMethod: Method is null");

        Object value = null;
        try {
            value = method.invoke(object, parameterValues);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

        return value;
    }

    /**
     * 调用某对象某方法
     * 
     * @param object
     *            对象
     * @param methodName
     *            方法名
     * @param parameterTypes
     *            方法参数类型列表
     * @param parameterValues
     *            方法参数值列表
     * @return 方法返回值
     */
    public static Object invokeMethod(Object object, String methodName, Class[] parameterTypes, Object[] parameterValues) {

        Method method = getMethodFromObject(object, methodName, parameterTypes);
        return invokeMethod(object, method, parameterValues);
    }

    // ------------------------------------------------//

    /**
     * 获取得到属性值的方法
     * 
     * @param object
     *            对象
     * @param property
     *            属性名
     * @return 属性值
     */
    public static Method getGetterMethod(Object object, String property) {

        String methodName = getGetterMethedName(property);
        Method method = getMethodFromObject(object, methodName, null);
        return method;
    }

    /**
     * 获取设置属性值的方法
     * 
     * @param object
     *            对象
     * @param property
     *            属性名
     * @param parameterType
     *            参数类型
     * @param parameterValue
     *            参数值
     * @return
     */
    public static Method getSetterMethod(Object object, String property, Class parameterType, Object parameterValue) {

        String methodName = getSetterMethedName(property);
        Method method = getMethodFromObject(object, methodName, parameterType);
        return method;
    }

    // ------------------------------------------------//

    /**
     * 满足JavaBean规范,获得属性值
     * 
     * @param object
     *            对象
     * @param property
     *            属性名
     * @return 属性值
     */
    public static Object getPropertyValue(Object object, String property) {

        isNullToRuntimeException(property, "getPropertyValue: Property is null");

        if (property.contains(".")) {
            Object obj = object;
            for (String prop : property.split("\\.")) {
                obj = getPropertyValue(obj, prop.trim());
            }
            return obj;
        } else {
            Method method = getGetterMethod(object, property);
            return invokeMethod(object, method, null);
        }
    }

    // ------------------------------------------------//

    /**
     * 满足JavaBean规范,设置属性值
     * 
     * @param object
     *            对象
     * @param property
     *            属性名
     * @param parameterType
     *            方法参数类型
     * @param parameterValue
     *            方法参数值
     */
    public static void setPropertyValue(Object object, String property, Class parameterType, Object parameterValue) {

        isNullToRuntimeException(property, "setPropertyValue: Property is null");

        if (property.contains(".")) {

            String beforeProp = property.substring(0, property.lastIndexOf("."));
            String afterProp = property.substring(property.lastIndexOf(".") + 1);

            Object obj = getPropertyValue(object, beforeProp);
            setPropertyValue(obj, afterProp, parameterType, parameterValue);
        } else {
            Method method = getSetterMethod(object, property, parameterType, parameterValue);
            invokeMethod(object, method, parameterValue);
        }
    }

    /**
     * 满足JavaBean规范,设置属性值
     * 
     * @param object
     *            对象
     * @param property
     *            属性名
     * @param parameterValue
     *            方法参数值
     */
    public static void setPropertyValue(Object object, String property, Object parameterValue) {

        isNullToRuntimeException(property, "setPropertyValue: Property is null");

        Object obj = null;
        String prop = null;

        if (property.contains(".")) {

            String beforeProp = property.substring(0, property.lastIndexOf("."));
            obj = getPropertyValue(object, beforeProp);
            prop = property.substring(property.lastIndexOf(".") + 1);
        } else {
            obj = object;
            prop = property;
        }

        String methodName = getGetterMethedName(prop);
        Method method = getMethodFromObject(obj, methodName, null);
        Class returnType = getRuntionType(method);
        setPropertyValue(obj, prop, returnType, parameterValue);
    }
}


你可能感兴趣的:(java反射工具类 ClassUtil)