zoukankan      html  css  js  c++  java
  • ReflectionUtils 类

    package com.atguigu.jdbc;

    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.lang.reflect.Modifier;
    import java.lang.reflect.ParameterizedType;
    import java.lang.reflect.Type;

    /**
    * 反射的 Utils 函数集合
    * 提供访问私有变量, 获取泛型类型 Class, 提取集合中元素属性等 Utils 函数
    * @author Administrator
    *
    */
    public class ReflectionUtils {


    /**
    * 通过反射, 获得定义 Class 时声明的父类的泛型参数的类型
    * 如: public EmployeeDao extends BaseDao<Employee, String>
    * @param clazz
    * @param index
    * @return
    */
    @SuppressWarnings("unchecked")
    public static Class getSuperClassGenricType(Class clazz, int index){
    Type genType = clazz.getGenericSuperclass();

    if(!(genType instanceof ParameterizedType)){
    return Object.class;
    }

    Type [] params = ((ParameterizedType)genType).getActualTypeArguments();

    if(index >= params.length || index < 0){
    return Object.class;
    }

    if(!(params[index] instanceof Class)){
    return Object.class;
    }

    return (Class) params[index];
    }

    /**
    * 通过反射, 获得 Class 定义中声明的父类的泛型参数类型
    * 如: public EmployeeDao extends BaseDao<Employee, String>
    * @param <T>
    * @param clazz
    * @return
    */
    @SuppressWarnings("unchecked")
    public static<T> Class<T> getSuperGenericType(Class clazz){
    return getSuperClassGenricType(clazz, 0);
    }

    /**
    * 循环向上转型, 获取对象的 DeclaredMethod
    * @param object
    * @param methodName
    * @param parameterTypes
    * @return
    */
    public static Method getDeclaredMethod(Object object, String methodName, Class<?>[] parameterTypes){

    for(Class<?> superClass = object.getClass(); superClass != Object.class; superClass = superClass.getSuperclass()){
    try {
    //superClass.getMethod(methodName, parameterTypes);
    return superClass.getDeclaredMethod(methodName, parameterTypes);
    } catch (NoSuchMethodException e) {
    //Method 不在当前类定义, 继续向上转型
    }
    //..
    }

    return null;
    }

    /**
    * 使 filed 变为可访问
    * @param field
    */
    public static void makeAccessible(Field field){
    if(!Modifier.isPublic(field.getModifiers())){
    field.setAccessible(true);
    }
    }

    /**
    * 循环向上转型, 获取对象的 DeclaredField
    * @param object
    * @param filedName
    * @return
    */
    public static Field getDeclaredField(Object object, String filedName){

    for(Class<?> superClass = object.getClass(); superClass != Object.class; superClass = superClass.getSuperclass()){
    try {
    return superClass.getDeclaredField(filedName);
    } catch (NoSuchFieldException e) {
    //Field 不在当前类定义, 继续向上转型
    }
    }
    return null;
    }

    /**
    * 直接调用对象方法, 而忽略修饰符(private, protected)
    * @param object
    * @param methodName
    * @param parameterTypes
    * @param parameters
    * @return
    * @throws InvocationTargetException
    * @throws IllegalArgumentException
    */
    public static Object invokeMethod(Object object, String methodName, Class<?> [] parameterTypes,
    Object [] parameters) throws InvocationTargetException{

    Method method = getDeclaredMethod(object, methodName, parameterTypes);

    if(method == null){
    throw new IllegalArgumentException("Could not find method [" + methodName + "] on target [" + object + "]");
    }

    method.setAccessible(true);

    try {
    return method.invoke(object, parameters);
    } catch(IllegalAccessException e) {
    System.out.println("不可能抛出的异常");
    }

    return null;
    }

    /**
    * 直接设置对象属性值, 忽略 private/protected 修饰符, 也不经过 setter
    * @param object
    * @param fieldName
    * @param value
    */
    public static void setFieldValue(Object object, String fieldName, Object value){
    Field field = getDeclaredField(object, fieldName);

    if (field == null)
    throw new IllegalArgumentException("Could not find field [" + fieldName + "] on target [" + object + "]");

    makeAccessible(field);

    try {
    field.set(object, value);
    } catch (IllegalAccessException e) {
    System.out.println("不可能抛出的异常");
    }
    }

    /**
    * 直接读取对象的属性值, 忽略 private/protected 修饰符, 也不经过 getter
    * @param object
    * @param fieldName
    * @return
    */
    public static Object getFieldValue(Object object, String fieldName){
    Field field = getDeclaredField(object, fieldName);

    if (field == null)
    throw new IllegalArgumentException("Could not find field [" + fieldName + "] on target [" + object + "]");

    makeAccessible(field);

    Object result = null;

    try {
    result = field.get(object);
    } catch (IllegalAccessException e) {
    System.out.println("不可能抛出的异常");
    }

    return result;
    }
    }

  • 相关阅读:
    module模块和包(十七)
    swap(十六)
    文件系统
    Confluence 6 管理协同编辑
    Confluence 6 管理协同编辑
    Confluence 6 数据收集隐私策略
    Confluence 6 修改警告的阈值和表现
    Confluence 6 警告的类型
    Confluence 6 诊断
    Confluence 6 垃圾收集性能问题
  • 原文地址:https://www.cnblogs.com/xiaona19841010/p/5198600.html
Copyright © 2011-2022 走看看