注解是一种特殊的接口,其继承了Annotation,其具体实现类是java运行时的动态代理类,我们可以通过反射获取到动态代理对象,再通过代理对象,就可以调用接口中定义的方法。
元注解是可以加在注解上的注解。元注解是不可以自定义的。元注解分为以下四个类型,现在通过图表来一一进行讲解。
1.@Retention
该注解是用来标注一个注解的生命周期,其参数包含 以下几种:
| RetentionPolicy.SOURCE | 源文件有效 |
| RetentionPolicy.CLASS | class文件有效 |
| RetentionPolicy.RUNTIME | 程序运行期间有效 |
2.@Targe
该注解可以被声明在哪些元素前,其参数包含以下几种:
| ElementType.TYPE | 注解只能被声明在一个类、接口、枚举前 |
| ElementType.FIELD | 注解只能被声明在一个类的字段前 |
| ElementType.METHOD | 注解只能被声明在一个类的方法前 |
| ElementType.PARAMETER | 注解只能被声明在一个方法参数前 |
| ElementType.CONSTRUCTOR | 该注解只能声明在一个类的构造方法前 |
| ElementType.LOCAL_VARIABLE | 该注解只能声明在一个局部变量前 |
| ElementType.ANNOTATION_TYPE | 该注解只能声明在一个注解类型前 |
| ElementType.PACKAGE | 注解只能声明在一个包名前 |
3.@Inherited
该注解将会被子类继承,如果定义的注解修饰了类A,那么类A的子类类B也会默认被修饰。
4.@documented
添加该注解表明在生成JavaDoc文档时,该注解也会出现在javaDoc文档中。
二、创建自定义注解 创建注解我们首先创建自定义注解@TestSource
@Retention(RetentionPolicy.RUNTIME)
@Targe(ElementType.FIELD)
@Inherited
@documented
public @interface TestSource {
public String my() default "this is it";
public int i() default 0;
}
注解的类型为@interface,并且在注解上加上了四个元注解,四个元注解的作用,可以参考上面所列的图表。
注解参数注解的参数,只能使用public或者默认default来进行修饰,并且只能使用基本的数据类列,包括:byte、short、char、int、long、float、double、boolean八种基本数据类型和String、Enum、Class、annotations等数据类型,以及这些类型的数组类型,并且注解可以使用默认值
三、注解使用我们新建一个Test类,并为类中属性加上自定义注解
public class Test {
@TestSource(my="test",i=1)
private String test;
}
这里,我们为test属性增加了注解,其中my属性设置为test,序号i设置为1
四、反射注解即然我们对属性test加上了注解,那么我们在程序运行过程中,也可以拿到注解的内容,具体可以通过以下方法,来拿到注解内容
public class Test1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Test test = new Test();
Field field = test.getClass().getDeclaredField("test");
field.setAccessible(true);
TestSource testSource = field.getAnnotation(TestSource.class);
System.out.println(testSource.my());
System.out.println(testSource.i());
}catch(Exception e)
{
e.printStackTrace();
}
}
}
五、结论
注解最开始的用处就是通过切面来给类、方法、或属性来加上一个标签,通过自定义的注解,我们可以灵活的在自己开发的代码中加上各类标签,也能更好的掌控自己的代码。
------------------------------------------------------------
欢迎关注我的公众号,获取更多信息



