通过反射获得自定义注解的值
1、简介
自动JDK5之后,注解逐渐进入了大众的视野,注解对程序的完成有很好的辅助作用,极大的简化了开发步骤与操作,那么如何定义一个注解,以及注解是如何生效的呢。
注解和反射是不可分割的,没有反射机制,程序就无法获得注解的值,也就无法进行后续操作,试想一下,如果我们能获得注解的值,我们就可以在后台用普通代码实现值的注入等等,这也是注解实现的简单原理。
2.定义注解
要想使用自定义注解,首先要定义注解,比如我们定义一个“Annotation”,这个注解是为了一个Person类的name属性赋值。
定义如下:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface Annotation{
String value();
}
如此,便定义了一个名为Annotation的注解,值得注意的是,注解的注解,也就是元注解,即上面的Target和Retention都是用来规定注解的功能的,比如@Target(ElementType.FIELD)表示这个定义的注解只在属性上有效,别的地方不能放这个注解,而@Retention(RetentionPolicy.RUNTIME)则表示运行时有效,也就是基本上任意时候都有效,除非程序执行完毕。另外常见的元注解还有@Documented和@Inherited,在此不做过多说明,感兴趣的可以自行搜索。
3.使用注解
定义注解是为了使用注解,比如我们现在定义一个类。
@Data
@NoArgsConstructor
@AllArgsConstructor
class Person{
private String name;
}
然后将注解加到定义的类中
@Data
@NoArgsConstructor
@AllArgsConstructor
class Person{
@Annotation(value = "张家瑞")
private String name;
}
这样,我们便对刚刚的注解进行了使用。
4.获取注解的值
看到注解并不是我们的最终目的,我们还要让机器取到注解中的值,毕竟注解不单单是该我们自己看的,还是让机器读取的,这里我们可以通过反射来实现对注解值的获取。
public class TestT {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
//获取类对象
Class c1 = Class.forName("top.zhang.springboot02.annotation.Person");
//获取属性对象
Field name = c1.getDeclaredField("name");
//获取注解对象
Annotation annotation = name.getAnnotation(Annotation.class);
//获取注解的值
String value = annotation.value();
//输出注解的值
System.out.println(value);
}
}
如此,便获得了刚刚在注解中写的“张家瑞”的值,获取注解成功,既然成功获取到了注解的值,那么后续操作自然就水到渠成了。
5.总结
注解的实现与反射是紧密相连的,为了读源码,必须对注解有一定了解,为了了解注解的执行过程,必须对反射有了解,因此注解和反射是学习java必须要掌握的。