首先,我们先写出一个自定义的注解
<span style="font-size:14px;">package com.test.aonntion; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; // 生命该注解的范围为属性 @Target(ElementType.FIELD) // 表示该注解为运行时注入 @Retention(RetentionPolicy.RUNTIME) public @interface Ioc { // obj传入的参数类型为object的子类的类型,默认参数为Object.class public Class<? extends Object> obj() default Object.class; }</span>
然后我们声明三个类 用来测试
先声明一个抽象的父类
<span style="font-size:14px;">package com.test.aonntion; public abstract class Parent { // 抽象方法 public abstract void say(); }</span>
在声明两个子类,继承自我们的父类
SON子类
<span style="font-size:14px;">package com.test.aonntion; public class Son extends Parent{ @Override public void say() { // 儿子打酱油去 System.out.println("i'm my Parent's Son"); } }</span><span style="font-weight: bold;"> </span>
Daughter子类
<span style="font-size:14px;">package com.test.aonntion; public class Daughter extends Parent { @Override public void say() { // 闺女打酱油去 System.out.println("i'm my Parent's Daughter"); } }</span>
接下来要完成我们的功能类的编写了
<span style="font-size:14px;">package com.test.aonntion; import java.lang.reflect.Field; public class IocTest { public static void startIoc(String objName) throws Exception{ // 获取该类 Class<?> clazz = Class.forName(objName); // 实例化该类的对象 Object testIoc = clazz.newInstance(); // 获得类下面的所有属性 Field[] fields = clazz.getDeclaredFields(); // 判断该类中的是否有属性 if(fields != null && fields.length > 0 ){ // 遍历所有的属性 for(int i =0;i < fields.length; i++){ // 获得当前属性的ioc注解 Ioc ioc = fields[i].getAnnotation(Ioc.class); // 如果当前属性的ioc注解不为空并且obj的值不为空 if( ioc != null && ioc.obj() != null ) { // 获得我们注入obj的类,并且实例化该类,得到该实例ojb Object ojb = ioc.obj().newInstance(); // 让属性支持强制注入,既-当属性为私有变量并且没有set方法时 // 强制调用set("属性名",要注入的属性); fields[i].setAccessible(true); // 将我们实例化的对象注入进属性内 fields[i].set(testIoc, ojb); } } } } // 这是我派去打酱油的是我儿子 @Ioc(obj=Son.class) // 声明一个父类对象1 private static Parent parent; // 这是我派去打酱油的是我闺女 @Ioc(obj=Daughter.class) // 声明一个父类对象2 private static Parent parent1; /** * @param args */ public static void main(String[] args) { try { // 启动注解 startIoc("com.test.aonntion.IocTest"); } catch (Exception e) { e.printStackTrace(); } // 父亲A派出打酱油的人说 parent.say(); // 父亲B派出打酱油的人说 parent1.say(); } }</span>
测试结果
时间: 2024-09-30 16:37:41