我之前的博客中说明过自己定义注解的声明今天我们来看看怎样对我们自己定义的注解进行使用。
1.我们在程序中使用我们的注解。
上一篇中我们自己定义了一个注解:
@Target(ElementType.FIELD)//注解的作用范围。就是注解是用在什么地方的
@Retention(RetentionPolicy.RUNTIME)//注解的级别,就是注解能留存到什么时候
@Documented
@Inherited
public @interface MyAnnotation {
public String value();//注解能够接收的參数
}
这个注解仅仅有一个參数,所以我们在使用时不须要显示说明參数名称。以下我们写一个类并使用注解。
public class People {
@MyAnnotation("liu")
private String name;
public People() {
Inject.injectfeild(this);
}
public String getName(){
return name;
}
}
大家能够看到我们写了一个类,并在他的上面写了一个我们的注解,如果我们如今要实现的功能是把注解中的值赋值给以下的属性name,那我们该怎么做呢。在这里我们能够看到我们在构造方法中调用了Inject.injectfeild(this),这种方法就是我们对注解进行解析。接下来我们就来看看详细是怎样做的。
2.对注解进行解析
废话不多说先上代码:
public class Inject {
public static void injectfeild(Object o){
Class<?> clazz = o.getClass(); //获得传进来的类
Field[] fields = clazz.getDeclaredFields();//通过反射获取类的域(全局变量)
for (Field field : fields) {
// 查看这个字段是否有我们自己定义的注解类标志的
if (field.isAnnotationPresent(MyAnnotation.class)) {
MyAnnotation inject = field.getAnnotation(MyAnnotation.class); //获取到我们的注解
String value=inject.value();//获取注解的參数
field.setAccessible(true);
try {
field.set(o, value);//为我们的字段赋值
} catch (IllegalArgumentException | IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
}
事实上我们就是通过反射获取了注解的值和相应的字段。在对他进行赋值。以下我们再来看看測试:
public class Test {
public static void main(String[] args) {
People people=new People();
System.out.println(people.getName());
}
}
结果:
liu
当然通常情况下一个普通的类的字段赋值我们能够直接给他一个set函数,这个样例仅仅是然大家理解怎样进行自己定义注解。可是在很多框架中他们的属性都是这样进行赋值,原因是为了解耦,有兴趣的能够学习一下ioc的相关知识。
因为上传到csdn的源代码审核还没过。须要源代码的能够在评论中留邮箱,我会尽快发过去。