一.Android反射工具类
package xx.com;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class RefInvoke {

    /** 根据全类名反射无参构造函数
     * 调用方式   Object obj = RefInvoke.createObject(className);
     * @param className 全类名
     * @return
     */
    public static Object createObject(String className) {
        Class[] pareTyples = new Class[]{};
        Object[] pareVaules = new Object[]{};

        try {
            Class r = Class.forName(className);
            return createObject(r, pareTyples, pareVaules);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        return null;
    }

    /** 根据类反射无参构造函数
     * 调用方式   Object obj = RefInvoke.createObject(className);
     * @param clazz 类
     * @return
     */
    public static Object createObject(Class clazz) {
        Class[] pareTyple = new Class[]{};
        Object[] pareVaules = new Object[]{};

        return createObject(clazz, pareTyple, pareVaules);
    }

    /**根据全类名(String)反射只有一个参数的构造函数
     * @param className  类名
     * @param pareTyple  参数类型
     * @param pareVaule  参数值
     * @return
     */
    public static Object createObject(String className, Class pareTyple, Object pareVaule) {
        Class[] pareTyples = new Class[]{ pareTyple };
        Object[] pareVaules = new Object[]{ pareVaule };

        try {
            Class r = Class.forName(className);
            return createObject(r, pareTyples, pareVaules);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        return null;
    }

    /**根据类(Class)反射只有一个参数的构造函数
     * @param clazz      类
     * @param pareTyple 参数类型
     * @param pareVaule 参数值
     * @return
     */
    public static Object createObject(Class clazz, Class pareTyple, Object pareVaule) {
        Class[] pareTyples = new Class[]{ pareTyple };
        Object[] pareVaules = new Object[]{ pareVaule };

        return createObject(clazz, pareTyples, pareVaules);
    }

    /**根据全类名(String)反射有多个参数的构造函数
     * @param className   类名
     * @param pareTyples  参数类型数组
     * @param pareVaules  参数值数组
     * @return
     */
    public static Object createObject(String className, Class[] pareTyples, Object[] pareVaules) {
        try {
            Class r = Class.forName(className);
            return createObject(r, pareTyples, pareVaules);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        return null;
    }

    /**根据类(Class)反射有多个参数的构造函数
     * @param clazz         类
     * @param pareTyples   参数类型数组
     * @param pareVaules   参数值数组
     * @return
     */
    public static Object createObject(Class clazz, Class[] pareTyples, Object[] pareVaules) {
        try {
            Constructor ctor = clazz.getDeclaredConstructor(pareTyples);
            ctor.setAccessible(true);
            return ctor.newInstance(pareVaules);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }


    /**
     * 调用实例方法,多个参数
     * @param obj  根据类名获取的构造函数对象
     * @param methodName  方法名
     * @param pareTyples  参数类型
     * @param pareVaules  参数值
     * @return
     */
    public static Object invokeInstanceMethod(Object obj, String methodName, Class[] pareTyples, Object[] pareVaules) {
        if (obj == null)
            return null;

        try {
            //调用一个private方法
            Method method = obj.getClass().getDeclaredMethod(methodName, pareTyples); //在指定类中获取指定的方法
            method.setAccessible(true);
            return method.invoke(obj, pareVaules);

        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }
    /**
     * 调用实例方法,一个参数
     * @param obj  根据类名获取的构造函数对象
     * @param methodName  方法名
     * @param pareTyple   参数类型
     * @param pareVaule  参数值
     * @return
     */
    public static Object invokeInstanceMethod(Object obj, String methodName, Class pareTyple, Object pareVaule) {
        Class[] pareTyples = {pareTyple};
        Object[] pareVaules = {pareVaule};

        return invokeInstanceMethod(obj, methodName, pareTyples, pareVaules);
    }

    /**
     * 调用实例方法,无参
     * @param obj  根据类名获取的构造函数对象
     * @param methodName  方法名
     * @return
     */
    public static Object invokeInstanceMethod(Object obj, String methodName) {
        Class[] pareTyples = new Class[]{};
        Object[] pareVaules = new Object[]{};

        return invokeInstanceMethod(obj, methodName, pareTyples, pareVaules);
    }


    /**调用静态方法,无参
     * @param className  类名(String)
     * @param method_name 方法名
     * @return
     */
    public static Object invokeStaticMethod(String className, String method_name) {
        Class[] pareTyples = new Class[]{};
        Object[] pareVaules = new Object[]{};

        return invokeStaticMethod(className, method_name, pareTyples, pareVaules);
    }

    /**调用静态方法,一个参数
     * @param className  类名(String)
     * @param method_name 方法名
     * @param pareTyple  参数类型
     * @param pareVaule  参数值
     * @return
     */
    public static Object invokeStaticMethod(String className, String method_name, Class pareTyple, Object pareVaule) {
        Class[] pareTyples = new Class[]{pareTyple};
        Object[] pareVaules = new Object[]{pareVaule};

        return invokeStaticMethod(className, method_name, pareTyples, pareVaules);
    }

    /**用静态方法,多个参数
     * @param className     类名(String)
     * @param method_name  方法名
     * @param pareTyples  参数类型[]
     * @param pareVaules  参数值[]
     * @return
     */
    public static Object invokeStaticMethod(String className, String method_name, Class[] pareTyples, Object[] pareVaules) {
        try {
            Class obj_class = Class.forName(className);
            return invokeStaticMethod(obj_class, method_name, pareTyples, pareVaules);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    /**调用静态方法,无参(Class)
     * @param clazz 类
     * @param method_name 方法名
     * @return
     */
    public static Object invokeStaticMethod(Class clazz, String method_name) {
        Class[] pareTyples = new Class[]{};
        Object[] pareVaules = new Object[]{};

        return invokeStaticMethod(clazz, method_name, pareTyples, pareVaules);
    }

    /**调用静态方法,一个参数(Class)
     * @param clazz 类
     * @param method_name 方法名
     * @param classType 参数类型
     * @param pareVaule 参数值
     * @return
     */
    public static Object invokeStaticMethod(Class clazz, String method_name, Class classType, Object pareVaule) {
        Class[] classTypes = new Class[]{classType};
        Object[] pareVaules = new Object[]{pareVaule};

        return invokeStaticMethod(clazz, method_name, classTypes, pareVaules);
    }

    /**调用静态方法,多个参数(Class)
     * @param clazz 类
     * @param method_name 方法名
     * @param pareTyples  参数类型[]
     * @param pareVaules  参数值[]
     * @return
     */
    public static Object invokeStaticMethod(Class clazz, String method_name, Class[] pareTyples, Object[] pareVaules) {
        try {
            Method method = clazz.getDeclaredMethod(method_name, pareTyples);
            method.setAccessible(true);
            return method.invoke(null, pareVaules);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }


    /**
     * 获取实例字段,简写版本
     * @param obj 根据类名获取的构造函数对象
     * @param filedName 字段名
     * @return
     */
    public static Object getFieldObject(Object obj, String filedName) {
        return getFieldObject(obj.getClass(), obj, filedName);
    }

    /**获取实例字段
     * @param className 类名
     * @param obj  根据类名获取的构造函数对象
     * @param filedName 字段名
     * @return
     */
    public static Object getFieldObject(String className, Object obj, String filedName) {
        try {
            Class obj_class = Class.forName(className);
            return getFieldObject(obj_class, obj, filedName);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**获取实例字段
     * @param clazz 类
     * @param obj   根据类名获取的构造函数对象
     * @param filedName  字段名
     * @return
     */
    public static Object getFieldObject(Class clazz, Object obj, String filedName) {
        try {
            Field field = clazz.getDeclaredField(filedName);
            field.setAccessible(true);
            return field.get(obj);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    /**设置实例字段,简写版本
     * @param obj  根据类名获取的构造函数对象
     * @param filedName  字段名
     * @param filedVaule 字段值
     */
    public static void setFieldObject(Object obj, String filedName, Object filedVaule) {
        setFieldObject(obj.getClass(), obj, filedName, filedVaule);
    }

    /**设置实例字段
     * @param clazz  类
     * @param obj    根据类名获取的构造函数对象
     * @param filedName  字段名
     * @param filedVaule  字段值
     */
    public static void setFieldObject(Class clazz, Object obj, String filedName, Object filedVaule) {
        try {
            Field field = clazz.getDeclaredField(filedName);
            field.setAccessible(true);
            field.set(obj, filedVaule);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**设置实例字段
     * @param className 类名(String)
     * @param obj   根据类名获取的构造函数对象
     * @param filedName  字段名
     * @param filedVaule  字段值
     */
    public static void setFieldObject(String className, Object obj, String filedName, Object filedVaule) {
        try {
            Class obj_class = Class.forName(className);
            setFieldObject(obj_class, obj, filedName, filedVaule);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }


    /**
     * 获取静态实例字段
     * @param className 类名(String)
     * @param filedName 字段名
     * @return
     */
    public static Object getStaticFieldObject(String className, String filedName) {
        return getFieldObject(className, null, filedName);
    }

    /**获取静态实例字段
     * @param clazz 类(Class)
     * @param filedName 字段名
     * @return
     */
    public static Object getStaticFieldObject(Class clazz, String filedName) {
        return getFieldObject(clazz, null, filedName);
    }

    /**设置静态实例字段
     * @param classname 类名
     * @param filedName 字段名
     * @param filedVaule 字段值
     */
    public static void setStaticFieldObject(String classname, String filedName, Object filedVaule) {
        setFieldObject(classname, null, filedName, filedVaule);
    }

    /**设置静态实例字段
     * @param clazz 类
     * @param filedName 字段名
     * @param filedVaule 字段值
     */
    public static void setStaticFieldObject(Class clazz, String filedName, Object filedVaule) {
        setFieldObject(clazz, null, filedName, filedVaule);
    }
}


二、调用示例

 


//1.获取类的private实例方法,并调用

final String className = "android.app.Activity";

public void test1() {
    try {
        //创建一个对象
        Class[] p3 = {int.class, String.class};
        Object[] v3 = {1, "123"};
        Object obj = RefInvoke.createObject(className, p3, v3);

        //一个参数
        Object result = RefInvoke.invokeInstanceMethod(obj, "doSOmething", String.class, "123");

        //无参数
        Object result2 = RefInvoke.invokeInstanceMethod(obj, "doSOmething2");

        //多个参数
        Class[] p4 = {String.class, int.class};
        Object[] v4 = {"bjq", 1};
        Object result3 = RefInvoke.invokeInstanceMethod(obj, "doSOmething3", p4, v4);

    } catch (Exception e) {
        e.printStackTrace();
    }
}
 
//2.获取类的private实例字段,并修改
public void test2() {
    try {
        //创建一个对象
        Class[] p3 = {int.class, String.class};
        Object[] v3 = {1, "bjq"};
        Object obj = RefInvoke.createObject(className, p3, v3);

        //获取name字段,private
        Object fieldObject = RefInvoke.getFieldObject(obj, "name");
        Object fieldObject3 = RefInvoke.getFieldObject(className, obj, "name");

        // 设置name字段
        // 只对obj有效
        RefInvoke.setFieldObject(obj, "name", "123456");
        RefInvoke.setFieldObject(className, obj, "name", "123456");

    } catch (Exception e) {
        e.printStackTrace();
    }
}
 
//3.获取类的private静态字段,并修改
public void test3() {
    try {
        Object fieldObject = RefInvoke.getFieldObject(className, "address");
        RefInvoke.setStaticFieldObject(className, "address", "ABCD");

        //静态变量,一次修改,终生受用
        TestClassCtor.printAddress();
    } catch (Exception e) {
        e.printStackTrace();
    }
}