zoukankan      html  css  js  c++  java
  • 对反射的封装

    --摘自《android插件化开发指南》

    前面是基本封装,后面是进一步的封装

    一。基本封装

    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    public class RefInvoke {
    
        //构造函数
        public static Object createObject(String className, Class[] pareTyples, Object[] pareVaules) {
            try {
                Class r = Class.forName(className);
                Constructor ctor = r.getDeclaredConstructor(pareTyples);
                ctor.setAccessible(true);
                return ctor.newInstance(pareVaules);
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            return null;
        }
    
        //调用实例方法
        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;
        }
    
        //调用静态方法
        public static Object invokeStaticMethod(String className, String method_name, Class[] pareTyples, Object[] pareVaules) {
            try {
                Class obj_class = Class.forName(className);
                Method method = obj_class.getDeclaredMethod(method_name, pareTyples);
                method.setAccessible(true);
                return method.invoke(null, pareVaules);
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            return null;
        }
    
        //获取字段值
        public static Object getFieldObject(String className, Object obj, String filedName) {
            try {
                Class obj_class = Class.forName(className);
                Field field = obj_class.getDeclaredField(filedName);
                field.setAccessible(true);
                return field.get(obj);
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            return null;
        }
    
        //设置字段值
        public static void setFieldObject(String classname, Object obj, String filedName, Object filedVaule) {
            try {
                Class obj_class = Class.forName(classname);
                Field field = obj_class.getDeclaredField(filedName);
                field.setAccessible(true);
                field.set(obj, filedVaule);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    No1:

    构造函数

    public class TestClassCtor {
        private String name;
    
        public TestClassCtor() {
            name = "baobao";
        }
    
        public TestClassCtor(int a) {
    
        }
    
        public TestClassCtor(int a, String b) {
            name = b;
        }
    
        private TestClassCtor(int a, double c) {
    
        }
    
        @Override
        public String toString() {
            return name;
        }
    }
    try {
                String className = "com.example.reflectiontest.TestClassCtor";
                Class r = Class.forName(className);
    
                //含参
                Class[] p3 = {int.class, String.class};
                Object[] v3 = {1, "bjq"};
                Object obj = RefInvoke.createObject(className, p3, v3);
                System.out.println(obj.toString());
    
                //无参
                Object obj2 = RefInvoke.createObject(className, null, null);
                System.out.println(obj2.toString());
    
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
    -------------------
    bjq
    baobao

    No2:

    实例方法

    public class TestClassCtor {
        private String name;
    
        public TestClassCtor() {
            name = "baobao";
        }
    
        public TestClassCtor(int a) {
    
        }
    
        public TestClassCtor(int a, String b) {
            name = b;
        }
    
        private TestClassCtor(int a, double c) {
    
        }
    
        private String doSomething(String d) {
            System.out.println("TestClassCtor,doSomething");
            return "123" + d;
        }
    }
    try {
        String className = "com.example.reflectiontest.TestClassCtor";
        Class r = Class.forName(className);
    
        Class[] p3 = {int.class, String.class};
        Object[] v3 = {1, "bjq"};
        Object obj = RefInvoke.createObject(className, p3, v3);
        //含参
        Class[] p4 = {String.class};
        Object[] v4 = {"jianqiang"};
        Object result = RefInvoke.invokeInstanceMethod(obj, "doSomething", p4, v4);
        System.out.println(result.toString());
    
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    -------------------------
    TestClassCtor,doSomething
    123jianqiang

    No3:

    调用静态方法

    public class TestClassCtor {
        private String name;
    
        public TestClassCtor() {
            name = "baobao";
        }
    
        public TestClassCtor(int a) {
    
        }
    
        public TestClassCtor(int a, String b) {
            name = b;
        }
    
        private TestClassCtor(int a, double c) {
    
        }
    
        private static void work() {
            System.out.println("TestClassCtor,work");
        }
    }
    try {
        String className = "com.example.reflectiontest.TestClassCtor";
        Class r = Class.forName(className);
    
        //含参
        Class[] p5 = {};
        Object[] v5 = {};
        RefInvoke.invokeStaticMethod(className, "work", p5, v5);
    
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    -----------------------
    TestClassCtor,work

    No4:

    设置字段的值

    public class TestClassCtor {
        private String name;
        private static String address;
    
        public TestClassCtor() {
            name = "baobao";
        }
    
        public TestClassCtor(int a) {
    
        }
    
        public TestClassCtor(int a, String b) {
            name = b;
        }
    
        private TestClassCtor(int a, double c) {
    
        }
    }
    try {
        String className = "com.example.reflectiontest.TestClassCtor";
        Class r = Class.forName(className);
    
        Class[] p3 = {int.class, String.class};
        Object[] v3 = {1, "bjq"};
        Object obj = RefInvoke.createObject(className, p3, v3);
    
        RefInvoke.setFieldObject(className, obj, "name", "jianqiang1982");
        Object fieldObject = RefInvoke.getFieldObject(className, obj, "name");
        System.out.println(fieldObject.toString());
    
        RefInvoke.setFieldObject(className, null, "address", "ABCD");
        Object fieldObject2 = RefInvoke.getFieldObject(className, null, "address");
        System.out.println(fieldObject2.toString());
    
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    ---------------------
    jianqiang1982
    ABCD

    二。进一步封装

    其实就是重构了一下

    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    public class RefInvoke {
    
        //无参
        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;
        }
    
        //无参
        public static Object createObject(Class clazz) {
            Class[] pareTyple = new Class[]{};
            Object[] pareVaules = new Object[]{};
    
            return createObject(clazz, pareTyple, pareVaules);
        }
    
        //一个参数
        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;
        }
    
        //一个参数
        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);
        }
    
        //多个参数
        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;
        }
    
        //多个参数
        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;
        }
    
    
        //多个参数
        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;
        }
    
        //一个参数
        public static Object invokeInstanceMethod(Object obj, String methodName, Class pareTyple, Object pareVaule) {
            Class[] pareTyples = {pareTyple};
            Object[] pareVaules = {pareVaule};
    
            return invokeInstanceMethod(obj, methodName, pareTyples, pareVaules);
        }
    
        //无参
        public static Object invokeInstanceMethod(Object obj, String methodName) {
            Class[] pareTyples = new Class[]{};
            Object[] pareVaules = new Object[]{};
    
            return invokeInstanceMethod(obj, methodName, pareTyples, pareVaules);
        }
    
    
        //无参
        public static Object invokeStaticMethod(String className, String method_name) {
            Class[] pareTyples = new Class[]{};
            Object[] pareVaules = new Object[]{};
    
            return invokeStaticMethod(className, method_name, pareTyples, pareVaules);
        }
    
        //一个参数
        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);
        }
    
        //多个参数
        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;
        }
    
        //无参
        public static Object invokeStaticMethod(Class clazz, String method_name) {
            Class[] pareTyples = new Class[]{};
            Object[] pareVaules = new Object[]{};
    
            return invokeStaticMethod(clazz, method_name, pareTyples, pareVaules);
        }
    
        //一个参数
        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);
        }
    
        //多个参数
        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;
        }
    
    
        //简写版本
        public static Object getFieldObject(Object obj, String filedName) {
            return getFieldObject(obj.getClass(), obj, filedName);
        }
    
        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;
        }
    
        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;
        }
    
        //简写版本
        public static void setFieldObject(Object obj, String filedName, Object filedVaule) {
            setFieldObject(obj.getClass(), obj, filedName, 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();
            }
        }
    
        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();
            }
        }
    
    
        public static Object getStaticFieldObject(String className, String filedName) {
            return getFieldObject(className, null, filedName);
        }
    
        public static Object getStaticFieldObject(Class clazz, String filedName) {
            return getFieldObject(clazz, null, filedName);
        }
    
        public static void setStaticFieldObject(String classname, String filedName, Object filedVaule) {
            setFieldObject(classname, null, filedName, filedVaule);
        }
    
        public static void setStaticFieldObject(Class clazz, String filedName, Object filedVaule) {
            setFieldObject(clazz, null, filedName, filedVaule);
        }
    }

    只要掌握了基本的java反射,就能够封装出来

    欢迎关注我的微信公众号:安卓圈

  • 相关阅读:
    寒假学习第一天
    课堂测试
    第十六周总结
    第十五周总结
    计算最长单词链
    第十四周总结
    人月神话阅读笔记03
    人月神话阅读笔记02
    第十五周学习进度
    冲刺第二十天
  • 原文地址:https://www.cnblogs.com/anni-qianqian/p/10088185.html
Copyright © 2011-2022 走看看