-
创建@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 {}
-
创建测试Controller
public class TestController { @Autowired private TestService testService; public TestService getTestService() { return testService; } }
-
创建测试Service
public class TestService {}
-
代码实现 并测试
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()); }}
-
运行结果