zoukankan      html  css  js  c++  java
  • Java反射技术工具类

    一、概述

      在上一节详细介绍了Java的反射技术。例如:如何根据字符串获取一个Class对象,如何操作Method、Constructor、Filed等等。这一节针对上一节的内容做一个工具类的封装,让反射技术用起来更方便。

    二、工具里:工具类中包含了所有必须的项,非常简单也非常的实用。

    package com.yw.reflectlib;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    /**
     * Java反射工具类
     * create by yangwei
     * on 2020-02-07 17:28
     */
    public class ReflectUtil {
        private ReflectUtil() {
        }
    
        private static ReflectUtil instance;
    
        public static ReflectUtil getInstance() {
            synchronized (ReflectUtil.class) {
                if (instance == null) {
                    instance = new ReflectUtil();
                }
            }
            return instance;
        }
    
        /**
         * 创建一个无参的构造函数
         *
         * @param className 类全名
         * @return
         */
        public Object createObject(String className) {
            Class[] classes = new Class[]{};
            Object[] objects = new Object[]{};
            return createObject(className, classes, objects);
        }
    
        /**
         * 创建一个无惨的构造函数
         *
         * @param clazz 类对象
         * @return
         */
        public Object createObject(Class clazz) {
            Class[] classes = new Class[]{};
            Object[] objects = new Object[]{};
            return createObject(clazz, classes, objects);
        }
    
        /**
         * 创建构造函数只有一个参数的对象
         *
         * @param className
         * @param paramType
         * @param paramValue
         * @return
         */
        public Object createObject(String className, Class paramType, Object paramValue) {
            Class[] classes = new Class[]{paramType};
            Object[] objects = new Object[]{paramValue};
            return createObject(className, classes, objects);
        }
    
        /**
         * 创建构造函数只有一个参数的对象
         *
         * @param clazz
         * @param paramType
         * @param paramValue
         * @return
         */
        public Object createObject(Class clazz, Class paramType, Object paramValue) {
            Class[] classes = new Class[]{paramType};
            Object[] objects = new Object[]{paramValue};
            return createObject(clazz, classes, objects);
        }
    
        /**
         * 创建一个多参数的对象
         *
         * @param className    类全名
         * @param paramsTypes  构造函数参数
         * @param paramsValues 默认构造函数要传的值
         * @return
         */
        public Object createObject(String className, Class[] paramsTypes, Object[] paramsValues) {
            try {
                Class clazz = Class.forName(className);
                Constructor constructor = clazz.getDeclaredConstructor(paramsTypes);
                constructor.setAccessible(true);
                return constructor.newInstance(paramsValues);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
        /**
         * 创建一个多参数的的对象
         *
         * @param clazz        类对象
         * @param paramsTypes  构造函数参数集合
         * @param paramsValues 构造函数参数值
         * @return
         */
        public Object createObject(Class clazz, Class[] paramsTypes, Object[] paramsValues) {
            try {
                Constructor constructor = clazz.getDeclaredConstructor(paramsTypes);
                constructor.setAccessible(true);
                Object object = constructor.newInstance(paramsValues);
                return object;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
        /*以下是执行方法****/
    
        /**
         * 执行类的方法
         *
         * @param obj          方法所在的类对象
         * @param methodName   方法名称
         * @param paramsTypes  方法参数
         * @param paramsValues 方法参数值
         * @return
         */
        public Object invokeMethod(Object obj, String methodName, Class[] paramsTypes, Object[] paramsValues) {
            if (obj == null)
                return null;
            try {
                Method method = obj.getClass().getDeclaredMethod(methodName, paramsTypes);
                method.setAccessible(true);
                method.invoke(obj, paramsValues);
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            return null;
        }
    
        /**
         * 执行只有一个参数的方法
         *
         * @param obj
         * @param methodName
         * @param paramType
         * @param paramValue
         * @return
         */
        public Object invokeMethod(Object obj, String methodName, Class paramType, Object paramValue) {
            Class[] classes = new Class[]{paramType};
            Object[] objects = new Object[]{paramValue};
            return invokeMethod(obj, methodName, classes, objects);
        }
    
        /**
         * 执行一个无惨的方法
         *
         * @param obj
         * @param methodName
         * @return
         */
        public Object invokeMethod(Object obj, String methodName) {
            Class[] classes = new Class[]{};
            Object[] objects = new Object[]{};
            return invokeMethod(obj, methodName, classes, objects);
        }
    
    
        /**
         * 执行一个多参数的静态方法
         *
         * @param className    类全名
         * @param methodName   方法名
         * @param paramsTypes  方法参数
         * @param paramsValues 方法参数值
         * @return
         */
        public Object invokeStaticMethod(String className, String methodName, Class[] paramsTypes, Object[] paramsValues) {
            try {
                Class clazz = Class.forName(className);
                Method method = clazz.getDeclaredMethod(methodName, paramsTypes);
                method.setAccessible(true);
                return method.invoke(null, paramsValues);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
        /**
         * 执行一个无惨的静态方法
         *
         * @param className
         * @param methodName
         * @return
         */
        public Object invokeStaticMethod(String className, String methodName) {
            Class[] classes = new Class[]{};
            Object[] objects = new Object[]{};
            return invokeStaticMethod(className, methodName, classes, objects);
        }
    
        /**
         * 执行一个参数的静态方法
         *
         * @param className
         * @param methodName
         * @param paramType
         * @param paramValue
         * @return
         */
        public Object invokeStaticMethod(String className, String methodName, Class paramType, Object paramValue) {
            Class[] classes = new Class[]{paramType};
            Object[] objects = new Object[]{paramValue};
            return invokeStaticMethod(className, methodName, classes, objects);
        }
    
        /**
         * 执行一个多参数的静态方法
         *
         * @param methodName   方法名
         * @param paramsTypes  方法参数
         * @param paramsValues 方法参数值
         * @return
         */
        public Object invokeStaticMethod(Class clazz, String methodName, Class[] paramsTypes, Object[] paramsValues) {
            try {
                Method method = clazz.getDeclaredMethod(methodName, paramsTypes);
                method.setAccessible(true);
                return method.invoke(null, paramsValues);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
        /**
         * 执行一个无惨的静态方法
         *
         * @param methodName
         * @return
         */
        public Object invokeStaticMethod(Class clazz, String methodName) {
            Class[] classes = new Class[]{};
            Object[] objects = new Object[]{};
            return invokeStaticMethod(clazz, methodName, classes, objects);
        }
    
        /**
         * 执行一个参数的静态方法
         *
         * @param methodName
         * @param paramType
         * @param paramValue
         * @return
         */
        public Object invokeStaticMethod(Class clazz, String methodName, Class paramType, Object paramValue) {
            Class[] classes = new Class[]{paramType};
            Object[] objects = new Object[]{paramValue};
            return invokeStaticMethod(clazz, methodName, classes, objects);
        }
    
        /**
         * 获取Field的值
         *
         * @param clazz     类的class
         * @param obj       类的实例对象
         * @param fieldName 属性名称
         * @return
         */
        public Object getField(Class clazz, Object obj, String fieldName) {
            try {
                Field field = clazz.getDeclaredField(fieldName);
                field.setAccessible(true);
                return field.get(obj);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
    
        }
    
        /**
         * 获取属性值
         *
         * @param obj
         * @param fieldName
         * @return
         */
        public Object getField(Object obj, String fieldName) {
            return getField(obj.getClass(), fieldName);
        }
    
        public Object getField(String className, Object obj, String fieldName) {
            try {
                Class clazz = Class.forName(className);
                return getField(clazz, obj, fieldName);
            } catch (Exception e) {
                e.printStackTrace();
    
            }
            return null;
        }
    
        /**
         * 设置属性的值
         *
         * @param clazz      类对象
         * @param obj        类实例对象
         * @param fieldName  属性名称
         * @param fieldValue 属性值
         * @return
         */
        public void setField(Class clazz, Object obj, String fieldName, Object fieldValue) {
            try {
                Field field = clazz.getDeclaredField(fieldName);
                field.setAccessible(true);
                field.set(obj, fieldValue);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public void setField(String className, Object obj, String fieldName, Object fieldValue) {
            try {
                Class clazz = Class.forName(className);
                Field field = clazz.getDeclaredField(fieldName);
                field.setAccessible(true);
                field.set(obj, fieldValue);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public void setField(Object obj, String fieldName, Object fieldValue) {
            setField(obj.getClass(), fieldName, fieldValue);
        }
    
        /**
         * 获取静态属性
         *
         * @param className
         * @param filedName
         * @return
         */
        public Object getStaticField(String className, String filedName) {
            return getField(className, null, filedName);
        }
    
        /**
         * 设置静态属性
         *
         * @param clazz
         * @param filedName
         * @return
         */
        public Object getStaticField(Class clazz, String filedName) {
            return getField(clazz, null, filedName);
        }
    
        /**
         * 设置静态属性
         *
         * @param classname
         * @param filedName
         * @param filedVaule
         */
        public void setStaticField(String classname, String filedName, Object filedVaule) {
            setField(classname, null, filedName, filedVaule);
        }
    
        /**
         * 获取静态属性
         *
         * @param clazz
         * @param filedName
         * @param filedVaule
         */
        public void setStaticField(Class clazz, String filedName, Object filedVaule) {
            setField(clazz, null, filedName, filedVaule);
        }
    
    }
    

     总结:大家看过工具类后会发现,反射经过封装后操作起来还是很简单的,只需要调用单例类,然后写入指定的参数就能得到想要的内容。

     下一节将介绍如何对泛型进行反射,敬请期待。 

  • 相关阅读:
    教你几招,快速创建 MySQL 五百万级数据,愉快的学习各种优化技巧
    JConsole、VisualVM 依赖的 JMX 技术到底是什么
    面试官你好,我已经掌握了MySQL主从配置和读写分离,你看我还有机会吗?
    Redis 内存压缩原理
    No qualifying bean of type 'org.springframework.transaction.TransactionManager' available: more than one 'primary' bean found among candidates:
    Java 代理模式
    JVisualVM 使用 jmx 连接远程tomcat进行数据分析
    MySQL 同时 delete 多张表的数据
    idea 打包 springboot 项目,tomcat正常启动但访问报404
    算法面试题:一个List<Student>,要求删除里面的男生,不用Linq和Lamda,求各种解,并说明优缺点!
  • 原文地址:https://www.cnblogs.com/tony-yang-flutter/p/12317639.html
Copyright © 2011-2022 走看看