代碼如下:
/**
* 注入的注解,為空,僅起標志作用
*/
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@interface Inject {
}
/**
* 獲取 bean 的容器,必通通過容器獲取,而不能使用 new,因為需要使用反射獲取注解信息並進行注入
*/
class Container {
public static <T> T getBean(Class<T> clazz) {
T obj = null;
try {
obj = clazz.newInstance();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
if (!field.isAnnotationPresent(Inject.class)) // 如果被@Inject注解了的話
continue;
if (!field.canAccess(obj))
field.setAccessible(true);
field.set(obj, field.getType().newInstance()); // 給它綁定一個對象
}
} catch (IllegalAccessException | InstantiationException e) {
throw new RuntimeException(e);
}
return obj;
}
}
//測試
class DAO {
public String getInfo() {
return "hello";
}
}
class Service {
@Inject
private DAO dao;
public void doSth() {
System.out.println(dao.getInfo());
}
public static void main(String[] args) {
Container.getBean(Service.class).doSth();
}
}
