首先,我们先写出一个自定义的注解
<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>
<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>
测试结果