1.复习一下基本反射获取对象属性方法

    /**
     * 描述 复习反射操作
     * @throws ClassNotFoundException
     */
    @Test
    public void test() throws ClassNotFoundException {
        //放射三种方式
        Class<TController> clazz1 = TController.class;

        Class<?> clazz2 = Class.forName("com.wjm.springcloud.controller.TController");

        //第三种
        TController tController = new TController();

        Class<? extends TController> clazz3 = tController.getClass();
        /**
         * 当前对象 的上测试里面的方法
         */
        //当前对象 全限定名
        System.out.println(clazz3.getName());
        //获取对象属性
        Field[] fields = clazz3.getDeclaredFields();
        for (Field f: fields) {
            System.out.println("属性 : " + f.getName() +" , "+ "类型 : " + f.getType().getName() +" , " + "修饰符 : " + f.getModifiers());
        }
        // 对象的类型 名称
        System.out.println(clazz3.getTypeName());
        //获取对象方法
        Method[] methods = clazz3.getMethods();
        for (Method m: methods) {
            System.out.println("方法名 : " + m.getName() +" , "+ "参数 : " + m.getParameters() +" , " + "修饰符 : " + m.getModifiers());
        }
    }

2.利用正常反射去调用方法

/**
     * 描述 利用正常反射去调用方法
     * @throws ClassNotFoundException
     * @throws NoSuchFieldException
     * @throws NoSuchMethodException
     * @throws InvocationTargetException
     * @throws IllegalAccessException
     */
    @Test
    public void auto2() throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        TController tController  = new TController();
        TService tService = new TService();

        Class<? extends TController> clazz = tController.getClass();

        Field tServiceField = clazz.getDeclaredField("tService");
        tServiceField.setAccessible(true);
        //通过方法才能够设置具体的属性值
        String name = tServiceField.getName();
        name = name.substring(0,1) + name.substring(1,name.length());

        String setMethodName = "set" + name;

        Method method = clazz.getMethod(setMethodName, TService.class);

        //反射
        method.invoke(tController, tService);

        System.out.println(tController.gettService());
    }

3.使用注解的方式去调用反射

    /**
     * 描述 使用注解的方式去调用反射
     * @throws ClassNotFoundException
     */
    @Test
    public void auto() throws ClassNotFoundException {
        TController tController = new TController();
        Class<? extends TController> clazz = tController.getClass();

        //获取所有属性值  Lambda表达式,用流的方式
        Stream.of(clazz.getDeclaredFields()).forEach(
                field -> {
                    //获取注解的方式
                    AutoZR annotation = field.getAnnotation(AutoZR.class);
                    if (annotation != null){
                        field.setAccessible(true);
                        //当前属性类型
                        Class<?> type = field.getType();
                        try {
                            //创建对象 弱类型,效率低,只能调用无参构造
                            Object fieldType = type.newInstance();
                            field.set(tController,fieldType);
                        } catch (InstantiationException e) {
                            e.printStackTrace();
                        } catch (IllegalAccessException e) {
                            e.printStackTrace();
                        }
                    }
                }
        );
        System.out.println(tController.gettService());
    }

走一个流程图

在这里插入图片描述

为什么要添加这么多processor?

	Spring是一个框架,作为框架,首先要考虑的就是扩展性
!扩展性!可以自定义processor,来完成整个bean的实例化过
程,增强某些功能

版权声明:本文为jj89929665原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/jj89929665/article/details/112715552