什么是注解
注解就相当于对源代码打的标签,给代码打上标签和删除标签对源代码没有任何影响。有的人要说了,你尽几把瞎扯,没有影响,打这些标签干毛线呢?其实不是这些标签自己起了什么作用,而且外部工具通过访问这些标签,然后根据不同的标签做出了相应的处理。这是注解的精髓,理解了这一点一切就变得不再那么神秘。
例如我们写代码用的IDE(例如 IntelliJ Idea),它检查发现某一个方法上面有@Deprecated这个注解,它就会在所有调用这个方法的地方将这个方法标记为删除。
访问和处理Annotation的工具统称为APT(Annotation Processing Tool)
注解需要配合反射来使用,用反射来读取注解的内容.进行其它的操作
注解的作用以及起源
在出现注解之前,xml被广泛的应用在描述元数据,不知道从什么时候开始,一些开发人员和架构师发现xml的维护越来越糟糕,他们希望使用一些和代码紧耦合的东西,而不是像xml那样和代码是松耦合的代码描述.
假如你想为应用设置很多的常量或参数,这种情况下,XML是一个很好的选择,因为它不会同特定的代码相连。如果你想把某个方法声明为服务,那么使用Annotation会更好一些,因为这种情况下需要注解和方法紧密耦合起来,开发人员也必须认识到这点。
元注解
用来给其他注解打标签的注解,即用来注解其他注解的注解。元注解共有6个。从上面的基本注解的源代码中就会看到使用了元注解来注解自己。
https://www.cnblogs.com/lyy-2016/p/6288535.html
注解的生命周期
@Retention– 定义该注解的生命周期。
RetentionPolicy.SOURCE – 在编译阶段丢弃。这些注解在编译结束之后就不再有任何意义,所以它们不会写入字节码。@Override, @SuppressWarnings都属于这类注解。
RetentionPolicy.CLASS – 在类加载的时候丢弃。在字节码文件的处理中有用。注解默认使用这种方式。
RetentionPolicy.RUNTIME– 始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注解的信息。我们自定义的注解通常使用这种方式。
https://blog.csdn.net/asdgbc/article/details/70196749
注解的作用域
表示该注解可以用于一个类中的那些属性及方法上,如果作用域类型有多个用英文逗号分隔
下面是注解的作用域的列表:
@Target(ElementType.TYPE) //接口、类、枚举、注解
@Target(ElementType.FIELD) //字段、枚举的常量
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法参数
@Target(ElementType.CONSTRUCTOR) //构造函数
@Target(ElementType.LOCAL_VARIABLE)//局部变量
@Target(ElementType.ANNOTATION_TYPE)//注解
@Target(ElementType.PACKAGE) ///包
https://blog.csdn.net/u012992462/article/details/80675932
自定义注解的使用
定义注解
@Target:描述当前注解能够作用的位置
ElementType.TYPE:可以作用在类上
ElementType.METHOD:可以作用在方法上
ElementType.FIELD:可以作用在成员变量上
@Retention: 描述注解被保留到的阶段
SOURCE:表示当前注解只在代码阶段有效
CLASS:表示该注解会被保留到字节码阶段
RUNTIME:表示该注解会被保留到运行阶段 JVM
自定义的注解:RetentionPolicy.RUNTIME;SOURCE < CLASS < RUNTIME
/**
* 本质: interface extends Annotation
* 属性和使用: 返回值 基本数据类型、string、enum、class、anno类型及数组类型
* 属性名是value的时候得特殊规定
* 元注解:注解的注解
*/
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Inherited
@Documented
public @interface MyAnno {
//注解中定义的方法叫做属性
int showInt() default 1;
String[] showStrArr();
ColorEnum showEnum();
MyAnno2 showAnno();
}
public enum ColorEnum {
RED,BlACk;
}
public @interface MyAnno2 {
String value();
}
使用
@MyAnno(showStrArr = {"hello","nx"},showEnum = ColorEnum.BlACk,showAnno=@MyAnno2("valueStr") )
public void shownx02(){
System.out.println("nx nx nx。。。");
}