实现@Autowried注解

  1. 创建@Autowried注解

    @Retention(RetentionPolicy.RUNTIME)
    /** *  RetentionPolicy.SOURCE 保留在.java 中 编译成 class 会被遗弃 
    *  RetentionPolicy.CLASS 会被保留到class中 但jvm加载class文件的时候会被遗弃 默认的生命周期 
    *  RetentionPolicy.RUNTIME 不仅会被保存到class文件中 而且 jvm加载class之后还会存在 
    */
    @Target(ElementType.FIELD) // 作用于属性之上
    /** *  ElementType.TYPE    接口 类 枚举 
    *  ElementType.FIELD   字段 枚举常量 
    *  ElementType.METHOD  方法 
    *  ElementType.PARAMETER   方法参数
     *  ElementType.CONSTRUCTOR 构造函数
     *  ElementType.LOCAL_VARIABLE  局部变量
     *  ElementType.ANNOTATION_TYPE 注解
     *  ElementType.PACKAGE     包
     */@Inherited // 是否能被继承与实现 (说明子类可以继承父类中的该注解)
    @Documented // 是否在文档展示 (说明该注解将被包含在javadoc中)
    public @interface Autowired {}
    
  2. 创建测试Controller

    public class TestController {    
    @Autowired    
    private TestService testService;    
    public TestService getTestService() {        return testService;    }
    }
    
  3. 创建测试Service

        public class TestService {}
    
  4. 代码实现 并测试

    public class AutowiredTest {
        public static void main(String[] args) {
            TestController testController = new TestController();
            //  反射获取类
            Class<? extends TestController> clazz = testController.getClass();
            // 获取所有属性值 并 遍历
            Stream.of(clazz.getDeclaredFields()).forEach(field -> {
                // 判断当前属性是否使用 Autowired 注解
                Autowired annotation = field.getAnnotation(Autowired.class);
                if (annotation != null){
                    field.setAccessible(true); // 私有属性可以被访问
                    // 获取类型 创建对应的对象
                    Class<?> type = field.getType();
                    try {
                        // 获取需要注入的类
                        Object o = type.newInstance();
                        // 注入
                        field.set(testController,o);
                    } catch (InstantiationException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                }
            });
            // 打印注入的类 输出地址值 则代表成功
            System.out.println(testController.getTestService());
        }}
    
  5. 运行结果