文档章节

JAVA 注解-学习篇(1)

p
 piz__
发布于 2016/11/21 19:28
字数 1221
阅读 13
收藏 0

JAVA注解

Annotation(注解)是JDK1.5及以后版本引入的。字面上看是解释的意思,但是没有那么简单。

注解可以用在这三个方面:

  1. 生成文档。这是最常见的,也是java 最早提供的注解。常用的有@see、@param、@return等,不过现在用的到比较少了。

  2. 跟踪代码依赖性,实现替代配置文件功能。比较常见的是spring 2.5 开始的基于注解配置。作用就是减少配置,现在的框架基本都使用了这种配置来减少配置文件的数量,这个是我们主要需要了解学习的,因为现在大部分框架都是使用这个的。比如spring中的@Controller等。

  3. 在编译时进行格式检查。如@Override 放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出。

java.lang.annotation.*下,包含所有JDK中的注解,java.lang.annotation.Annotation 是所有注解继承的接口,并且是自动继承,不需要定义时指定,类似于所有类都自动继承Object。

元注解

在java.lang.annotation下定义了四个元注解;

1.@Retention:注解的注解,元注解之一,

作用:定义注解的保留策略

用法:Retention注解有一个属性value,是RetentionPolicy类型的,Enum RetentionPolicy是一个枚举类型, 这个枚举决定了Retention注解应该如何去保持,也可理解为Rentention 搭配 RententionPolicy使用。 RetentionPolicy有3个值:CLASS,RUNTIME,SOURCE

  • 用@Retention(RetentionPolicy.CLASS)修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,但不会被虚拟机读取在运行的时候;
  • 用@Retention(RetentionPolicy.SOURCE )修饰的注解,表示注解的信息会被编译器抛弃,不会留在class文件中,注解的信息只会留在源文件中;
  • 用@Retention(RetentionPolicy.RUNTIME )修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,会被虚拟机保留在运行时,

所以我们自定义注解时,一般使用@Retention(RetentionPolicy.RUNTIME )。可以让你从JVM中读取Annotation注解的信息,以便在分析程序的时候使用。

2.@Target:也是用来修饰注解的元注解,

作用:定义注解的作用目标

用法:它有一个属性ElementType也是枚举类型,值为:ANNOTATION_TYPE,CONSTRUCTOR,FIELD,LOCAL_VARIABLE,METHOD,PACKAGE,PARAMETER,TYPE,可以使用 @Target({ElementType.TYPE,ElementType.FIELD})定义多个作用目标。

  • @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) / // 包

3.@Documented:说明该注解将被包含在javadoc中,无属性值。

4.@Inherited:说明子类可以继承父类中的该注解,无属性值。

Annotation的工作原理

JDK5.0中提供了注解的功能,允许开发者定义和使用自己的注解类型。该功能由一个定义注解类型的语法和描述一个注解声明的语法,读取注解的API,一个使用注解修饰的class文件和一个注解处理工具组成。

Annotation并不直接影响代码的语义,但是他可以被看做是程序的工具或者类库。它会反过来对正在运行的程序语义有所影响。

Annotation可以冲源文件、class文件或者在运行时通过反射机制多种方式被读取。

常见注解

1.@Override注解:

package java.lang
import java.lang.annotation.*
                
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override{
}

这个注解是在子类继承父类是,要重写父类的方法的一个标记。如果方法利用此注释类型进行注解但没有重写超类方法,则编译器会生成一条错误消息。

由源码可以看出,只作用与方法中,同样注解不会被class编译,只会保留在源码中。

@Override是一个Marker annotation(类体里面没有成员),用于标识的Annotation,Annotation名称本身表示了要给工具程序的信息。

2.@Deprecated注解:

package java.lang;

import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}

指示应该在注释元素(以及包含在该注释元素中的所有程序元素)中取消显示指定的编译器警告,表示不鼓励开发人员使用该注解标志的东西。

注意:在给定元素中取消显示的警告集是所有包含元素中取消显示的警告的超集。例如,如果注释一个类来取消显示某个警告,同时注释一个方法来取消显示另一个警告,那么将在此方法中同时取消显示这两个警告。

© 著作权归作者所有

共有 人打赏支持
p
粉丝 4
博文 28
码字总数 15580
作品 0
上海
Java注解教程:自定义注解示例,利用反射进行解析

Java注解能够提供代码的相关信息,同时对于所注解的代码结构又没有直接影响。在这篇教程中,我们将学习Java注解,如何编写自定义注解,注解的使用,以及如何使用反射解析注解。 注解是Java ...

哲别0
2017/10/23
0
0
spring boot框架学习4-spring boot核心(3)

本节主要: 1:spring boot 为我们提供的 starter pom 都有哪些 2:怎么添加xml配置文件 3:日志相关 本文是《凯哥陪你学系列-框架学习之spring boot框架学习》中第四篇 spring boot框架学习...

凯哥java
2017/10/31
0
0
通过 HttpAuthenticationMechanism 执行 Web 身份验证

通过 Java EE 8 中新的注解驱动的 HTTP 身份验证机制执行经典和自定义的 Servlet 身份验证 系列内容: 此内容是该系列 4 部分中的第 # 部分: Java EE 8 Security API 入门,第 2 部分 http...

Alex Theedom
04/02
0
0
spring boot框架学习2-spring boot核心(1)

本节主要: 1:解析spring boot入口和@SpringBootApplication源码详解 SpringBootApplication包含: @SpringBootConfiguration @ComponentScan @EnableAutoConfiguration 本文是《凯哥陪你学......

凯哥java
2017/10/27
0
0
spring boot框架学习3-spring boot核心(2)

本节主要: 1:解析spring boot入口和@SpringBootApplication源码详解 SpringBootApplication包含: @SpringBootConfiguration @ComponentScan @EnableAutoConfiguration 本文是《凯哥陪你学......

凯哥java
2017/10/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

造谣造到t-io老巢了

只发当事人的截图,不发表评论,以免有引导嫌疑 PS1:截图是由不同的人发给我的 PS2:本人早就不在此微信群了 PS3:图3是2018-09-23的t-io官方群的一个发言小统计

talent-tan
10分钟前
15
0
heartbeat 资源

drbd+apache+heartbeat : http://blog.51cto.com/11838039/1827901 heartbeat双机热备的架设 : http://blog.51cto.com/11838039/1827560 对heaetbeat的深一步认识 : http://blog.51cto.co......

寰宇01
44分钟前
3
0
Spring 转换 model 为 json 时增加属性

缘起 目前的项目中有个需求是在附件对象转换成 json 时增加个 url 属性,以前的方式是在返回附件对象或列表时候做一次统一处理,这次想看看 spring 或者 jackson fasterxml 是否自带类似功能...

郁也风
今天
1
0
10大PHP比特币开源项目

如果你是一个Phper,如果你希望学习区块链,那么本文列出的 10个开源的Php比特币项目,将有助于你了解在自己的应用中 如何加入对比特币的支持。 如果你希望快速掌握使用Php对接比特币钱包的方...

汇智网教程
今天
1
0
springclould feign客户端添加全局参数

用springclould feign作为调用服务的客户端,一般来说参数可以写在feignclient的方法参数里 有时需要所有feign请求都统一添加一些参数,例如token用于鉴权等,可以这样做: 添加一个配置类,...

canneljls
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部