很多做过安卓的人都会用到最当下最流行的框架dragger2 和ButterKnife,这些依赖注入框架用起来非常方便,并且解耦,现在看看java依赖注入的简单用法,它的底层还是注解和反射,呵呵呵。所以java的反射是多么的重要
先看测试类的代码:
public class TestInjection {
@InjectNameInfo("赵敏+黎姿")
static String name;
@InjectAgeInfo(19)
static int age;
public static void main(String[] args) {
try {
ParseAnnocation annocation=new ParseAnnocation(new TestInjection());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
System.out.println("people的信息是:Age=="+age+",Name=="+name);
}
}
}
2.两个自定义的注解,ageinfo和nameinfo
@Target(ElementType.FIELD)//元注解:作用范围在成员上
@Retention(RetentionPolicy.RUNTIME)//元注解:作用周期在运行时
@Documented //元注解:随文档生成
public @interface InjectAgeInfo {
//注入 年龄,默认17岁
int value() default 17;
}
@Target(ElementType.FIELD)//元注解:作用范围在成员上
@Retention(RetentionPolicy.RUNTIME)//元注解:作用周期在运行时
@Documented //元注解:随文档生成
public @interface InjectNameInfo {
//年龄,类型String 默认值:中国人
String value() default "中国人";
}
3.注解解析类ParseAnnocation的代码
public class ParseAnnocation {
public ParseAnnocation(Object obj) throws IllegalArgumentException, IllegalAccessException {
//1.获取类文件
Class tagetCls = obj.getClass();
//2.获取所有字段
Field[] fields= tagetCls.getDeclaredFields();
for (Field field : fields) {
System.out.println("test 字段:"+field.getName());
//3.判断字段是否含有该字段
if(field.isAnnotationPresent(InjectAgeInfo.class)){
//4.获取该注解
InjectAgeInfo ageInfo= field.getAnnotation(InjectAgeInfo.class);
//5.给字段设置值
field.set(obj, ageInfo.value());
}
if(field.isAnnotationPresent(InjectNameInfo.class)){
InjectNameInfo nameInfo=field.getAnnotation(InjectNameInfo.class);
field.set(obj, nameInfo.value());
}
}
}
}
4.最后的运行结果如下: