使用annotation的好处是什么
注解是众多引入到java SE5中的重要语言变化之一。他们可以提供用来完整地描述程序所需的信息,而这些信息是无法用java来表达的。因此,注解使得我们能够以将由编译器来测试和验证的格式,存储有关程序的额外信息。注解可以用来生成描述符文件,甚至或是新的类定义,并且有助于减轻编写样板代码的负担。通过使用注解,我们可以将这些元数据保存在java源代码中,并利用annotation API为自己的注解构造处理工具,同时,注解的优点还包括:更加干净易读的代码以及编译器类型检查等。虽然Java SE5预先定义了一些元数据,但一般来说,主要还是需要程序员自己添加新的注解,并且按自己的方式使用它们。
------摘自《Java编程思想》
官方的定义:
An annotation is a form of metadata, that can be added to Java source code. Classes, methods, variables, parameters and packages may be annotated. Annotations have no direct effect on the operation of the code they annotate.
作用
Annotations have a number of uses, among them:
Information for the compiler — Annotations can be used by the compiler to detect errors or suppress warnings.
Compile-time and deployment-time processing — Software tools can process annotation information to generate code, XML files, and so forth.
Runtime processing — Some annotations are available to be examined at runtime.
a. 标记,用于告诉编译器一些信息
b. 编译时动态处理,如动态生成代码
c. 运行时动态处理,如得到注解信息
Java注解可以用在构建期。当构建我们的工程时,构建进程会编译源码、生成xml文件,打包编译后的代码和文件到jar包。构建过程一般由构建工具自动完成,常用的构建工具有ant、maven。构建工具在构建时会自动扫描我们的代码,当遇到构建期注解时,会根据注解的内容生成源码或者其它文件。
注解的格式
1. 一个java注解由一个@符后面跟一个字符串构成;
2.java注解中一般包含一些元素,这些元素类似于属性或者参数,可以用来设置值。
注解的位置
注解可以用于描述一个类、接口、方法、方法参数、字段、局部变量等。
使用的细节
1.如果注解没有参数则不用写参数体,比如@Override;
2.如果只有一个参数比如named value,则参数名可以省略;
3.也可以同时使用多个注解来标示;
4.可以重复使用同一个注解,不过只有在java SE 8 才支持
注意:如果想自定义一个可以用于重复使用的注解(自定义注解在后面会涉及),记得加上@Repeatable。
Java内置注解
Java本身提供了三个内置注解,他们分别是:
- @Deprecated----描述一个类、方法或者字段,表示java不赞成使用这些被描述的对象,如果我们使用了这些类、方法或者字段,编译器会给我们警告。
- @Override-----一个编译时注解,它主要用在一个子类的方法中,当被注解的子类的方法在父类中找不到与之匹配的方法时,编译器会报错。
- @SuppressWarnings------使编译器忽略掉编译器警告。比如,如果我们的一个方法调用了一个@Deprecated方法,或者做了一个不安全的类型转换,此时编译器会生成一个警告。如果我们不想看到这些警告,我们就可以使用@SuppressWarnings注解忽略掉这些警告.
自定义注解
@interface关键字就代表这是一个注解类型,所以使用@interface关键字就可以创建注解了。注解中的每个元素定义类似于接口中的方法定义。每个元素定义包含一个数据类型和名称,注解元素的数据类型可以是java基本数据类型、String、数组,但不能是复杂对象类型。
可以通过default关键字为某个元素设置默认值,当一个元素被设置默认值之后,这个元素便成了注解的可选元素。
在java中相信大家对@Documented这个注解非常熟悉吧?没错,这个注解的作用就是java用来提供给大家将你的信息注入到java-doc文档中,作为api的文档描述查看。那么我们完全可以在我们自定义的注解上使用@Documented。
这里的@Documented注解为什么能直接作用于我们自定义的注解?这里引入我们下面的元注解。
元注解
元注解就是用来描述注解的注解,在java中有以下几个元注解:
@Documented
作用是告诉JavaDoc工具,当前注解本身也要显示在Java Doc中。比如上面我写的自定义注解。
@Retention
用来定义当前注解的作用范围,有以下三个范围可选:
1.RetentionPolicy.SOURCE : 注解只存在于源码中,不会存在于.class文件中,在编译时会被忽略掉
2.RetentionPolicy.CLASS:注解只存在于.class文件中,在编译期有效,但是在运行期会被忽略掉,这也是默认范围
3.RetentionPolicy.RUNTIME:在运行期有效,JVM在运行期通过反射获得注解信息
@Target
用于指定注解作用于java的哪些元素,未标注则表示可修饰所有.
- @Inherited
注解表示当前注解会被注解类的子类继承。
Annotation解析
注解的详细使用已经介绍完了,那么在现实开发中我们一般如何使用呢?一般我们会自定义一些注解,来简化和设计我们的代码,然后在运行时通过反射机制获取到注解的信息来使用。
编译时Annotation解析
代码示例具体请参考博文:https://blog.csdn.net/u013703461/article/details/66259013 和 https://www.cnblogs.com/xdp-gacl/p/3622275.html
SSM框架中注解含义及应用场景小结:https://www.cnblogs.com/ka-bu-qi-nuo/p/7397428.html