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);
    }

}

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

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

posted on 2020-02-16 17:22  飘杨......  阅读(406)  评论(0编辑  收藏  举报