Java注解

不会写注解的程序员不是真正的程序员,不会写自定义注解的程序员不是好的程序员。

Java中常见的注解


@Override 表示当前方法覆盖了父类的方法 属于编译注解

@Deprecated 表示方法已经过时,方法上有横线,使用时会有警告。 属于编译注解

@SuppviseWarnings(“deprecation”) 表示关闭一些警告信息(通知java编译器忽略特定的编译警告) 属于编译注解


注解的分类



按运行机制分:源码注解、编译注解、运行注解
源码注解:注解只在源码中存在,当编译成.class文件时注解就不存在了
编译注解:在源码跟.class文件中都存在。
运行注解:在运行时还会存在,甚至会影响到运行的逻辑。

按照来源分:
JDK注解、自己定义的注解、第三方注解

元注解–注解的注解


@Target() //作用域
1.CONSTRUCTOR 构造方法声明 2.FIELD 字段声明 3.LOCAL_VARIABLE 局部变量声明 4.METHOD 方法声明 5.PACKAGE 包声明 6.PARAMETER 参数声明 7.TYPE类接口

@Retention() //生命周期
1.SOURCE 只在源码时显示,编译时会丢失。2.CLASS 编译时会记录到.class文件中,运行时丢失。3.RUNTIME 运行时存在,可以通过反射读取。

@Inherited //允许子类继承

@Document 生成javadoc时会包含注解
自定义注解:
使用@interface进行自定义注解
public @interface Description{
String desc(); //成员以无参无异常的方式声明。
String author();
int age() default 18; //可以用default为成员指定一个默认值
}
成员的类型是受限制的,合法的类型包括原始类型及String,Class,Annotation,Enumeration
如果注解只有一个成员,则成员只能起名为value(),在使用时可以忽略成员名和赋值号(=)。
注解类可以没有成员,没有成员的注解类成为标识注解

使用注解的方法:
@<注解名>(<成员名1>=<成员值1>,<成员名1>=<成员值1>,…)


解析注解



概念:通过反射获取类、函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑。

方法:
1.先获取到类的类类型。
2.通过类的类类型的isAnnotationPresen(注解名.class)方法判断类上是否存在该注解,返回值为boolean类型。
3.若返回值为true,则通过类类型的getAnnotation(注解名.class)获取注解实例,返回值为注解类型。需要强制类型转换。通过value()方法可以获得注解的名称
4.获取方法的注解与获取类的注解类似,先通过类类型的getMethod()方法获得一个Method类型的数组,然后回到1,2步骤。也可以通过Method对象的getAnnotations()方法获取到方法的所有注解,将其放入到一个Annotation类型的数组中,然后在进行遍历。

注解的继承问题:若在父类的接口中存在注解,而在子类进行实现的时候注解是不存在的。在类中,若父类存在注解,注解在子类中也是存在的,若子类重写了父类的方法,则在子类中被重写的方法不存在父类的注释。