Java 注解 So Easy!!!
Java注解
Annotations, a form of metadata, provide data about a program that is not part of the program itself. Annotations have no direct effect on the operation of the code they annotate.
Java
注解是一种元数据,(元数据,用来描述数据的数据,主要其描述作用,让数据变得有具体的作用),注解对程序提供一些数据,但不是程序的部分.注解不能直接影响所标注的代码.
注解用于为 Java 代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的。Java 注解是从 Java5 开始添加到 Java 的。
注解有许多用处,主要如下:
提供信息给编译器(Information for the compiler): 编译器可以利用注解来探测错误和警告信息
编译阶段时的处理(Compile-time and deployment-time processing ): 软件工具可以用来利用注解信息来生成代码、Html文档或者做其它相应处理。
运行时的处理(Runtime processing): 某些注解可以在程序运行的时候被检测到
值得注意的是,注解不是代码本身的一部分。
一. 注解的基础
利用IDE自动生成重写父类或者接口的方法时,都会生成如下的格式:
@Override
void mySuperMethod() { ... }
其中@Override
就是一个简单的注解 @暗示编译器这是一个注解.
同样注释也可以拥有属性,例如:
@Author(
name = "Benjamin Franklin",
date = "3/27/2003"
)
class MyClass() { ... }
如果只有一个属性,可以省略=
和属性名
@SuppressWarnings(value = "unchecked")
void myMethod() { ... }
//等效的
@SuppressWarnings("unchecked")
void myMethod() { ... }
如果注解没有属性,那么括号也可以省略
@Author(name = "Jane Doe")
@Author(name = "John Smith")
@EBook
class MyClass { ... }
细心的读者可能发现.这里使用了两个@Author
.通常注解只能是一个,在JKD1.8出现了可重复注解
在哪里使用注解 :
在JDK 1.8之前, 注解只能使用在声明地方,例如类的声明,方法的声明,属性的声明的地方.通常的约定是注解独占一行.在JDK 1.8之后,注解可以出现在使用类型的地方
- 创建一个对象时:
new @Interned MyObject();
- 类型转换
myString = (@NonNull String) str;
- 抛出异常时:
void monitorTemperature() throws
@Critical TemperatureException { ... }
上面的这种用法叫做类型注解
,可以在任何使用类型的地方使用.类型可以包括(类,属性,方法,定义的常量).这是JDK 1.8 更新的内容,同时更新的还有可重复注解
二.如何创建一个注解
注解通过 @interface 关键字进行定义。它的形式跟接口很类似,不过前面多了一个 @ 符号。上面的代码就创建了一个名字为 TestAnnotaion 的注解。
public @interface TestAnnotation {
}
使用自定义注解
@TestAnnotation
public class Test {
}
创建带有属性的注解
@interface ClassPreamble {
String author();
String date();
int currentRevision() default 1;
String lastModified() default "N/A";
String lastModifiedBy() default "N/A";
// Note use of array
//在这里使用了数组作为属性
String[] reviewers();
}
@ClassPreamble (
author = "John Doe",
date = "3/17/2002",
currentRevision = 6,
lastModified = "4/12/2004",
lastModifiedBy = "Jane Doe",
// Note array notation
//数组在注解的使用方法
reviewers = {"Alice", "Bob", "Cindy"}
)
public class Generation3List extends Generation2List {
// class code goes here
}
三.可重复的注解:
这是JDK1.8 的更新.
例如:
如果你写了一个方法,需要在不同的时间执行,例如像UNIX的定时任务.那么我们可以利用注解@Schedule
来表明方法执行的会时间 .
@Schedule(dayOfMonth="last")
@Schedule(dayOfWeek="Fri", hour="23")
public void doPeriodicCleanup() { ... }
它的创建需要两个部分
- 定义一个可以重复的注解
import java.lang.annotation.Repeatable;
@Repeatable(Schedules.class) //不要忘记.class
public @interface Schedule {
String dayOfMonth() default "first";
String dayOfWeek() default "Mon";
int hour() default 12;
}
- 声明一个重复注解类型的容器
public @interface Schedules {
Schedule[] value();
}
什么是容器注解呢?就是用来存放其它注解的地方。它本身也是一个注解。 按照规定,它里面必须该容器要有一个 value 的属性,属性类型是一个被 @Repeatable 注解过的注解数组,注意它是数组。
四. Java语言预定义的注解(Predefined Annotation Types
在Java API中提前 定义了一些注解,这些注解有的被编译器使用(例如@Overrider),有的被其他注解使用 ,被其他注解使用的有 @Retention
@Document
@Target
@Inherited
@Repeatable
5种
@Retention
@Retention 应用到一个注解上的时候,它解释说明了这个注解的的生命周期。
它的取值如下:
- RetentionPolicy.SOURCE : 注解只在源代码阶段保留,在编译器编译时将忽略它
- RetentionPolicy.CLASS : 注解只在编译阶段存在,不会加载到JVM中
- RetentionPolicy.RUNTIME :注解可以保留到程序运行,在程序运行时可以获取到他们
- @DOCument
这个注解表示能够将注解中的元素包含到Javadoc中. - @Target
@Target 表示注解运用的地方 ,限定注解使用的地方
- ElementType.ANNOATION_TYPE 可以给一个注解 进行注解
- ElementType.CONSTRUCTOR 可以给构造器注解
- ElementType.FIELD 可以给竖向进行注解
- ElementType.LOCAL_VARIABLE 可以给局部局部变量注解
- ElementType.METHOD 可以给方法注解
- ElemntType.PACKAGE 可以给包注解
- ElementType.PARMETER 可以给一个方法内的参数进行注解
- ElementType.TYPE 可以给一个类型进行注解,比如类,接口,枚举
- @Inherited
Inherited 是继承的意思,但是它并不是说注解本身可以继承,而是说如果一个超类被 @Inherited 注解过的注解进行注解的话,那么如果它的子类没有被任何注解应用的话,那么这个子类就继承了父类的注解。
五 类型注解
Java8 为 ElementType 枚举增加了TYPE_PARAMETER、TYPE_USE两个枚举值,从而可以使用 @Target(ElementType_TYPE_USE) 修饰注解定义,这种注解被称为类型注解,可以用在任何使用到类型的地方。
在 java8 以前,注解只能用在各种程序元素(定义类、定义接口、定义方法、定义成员变量…)上。从 java8 开始,类型注解可以用在任何使用到类型的地方。
TYPE_PARAMETER:表示该注解能写在类型参数的声明语句中。 类型参数声明如: 、
TYPE_USE:表示注解可以再任何用到类型的地方使用,比如允许在如下位置使用:
- 创建对象(用 new 关键字创建)
- 类型转换
- 使用 implements 实现接口
- 使用 throws 声明抛出异常
@Target(ElementType.TYPE_USE)
@interface NotNull{
}
// 定义类时使用
// 在implements时使用
@NotNull
public class TypeAnnotationTest implements Serializable {
// 在方法形参中使用
// 在throws时使用
public static void main(@NotNull String [] args) throws @NotNull FileNotFoundException {
Object obj = "fkjava.org";
// 使用强制类型转换时使用
String str = (@NotNull String) obj;
// 创建对象时使用
Object win = new (@NotNull) JFrame("疯狂软件");
}
// 泛型中使用
public void foo(List<@NotNull String> info) {
}
}
这种类型注解,可以让编译器执行更严格的代码检查,从而提高程序的健壮性。
java8本身并没有提供这种注解的框架,要想这些注解发挥作用,需要开发者自己实现,或者使用第三方提供的工具
这里提供一个第三方框架Checker Framework,如果感兴趣的话可以看一看.
Java 注解 So Easy!!!的更多相关文章
- 干掉前端!3分钟纯 Java 注解搭个管理系统
大家好,我是小富~ 最近接触到个新项目,发现它用了一个比较有意思的框架,可以说实现了我刚入行时候的梦想,所以这里马不停蹄的和大家分享下. 在我刚开始工作接触的项目都还没做前后端分离,经常需要后端来维护 ...
- Java注解
Java注解其实是代码里的特殊标记,使用其他工具可以对其进行处理.注解是一种元数据,起到了描述.配置的作用,生成文档,所有的注解都隐式地扩展自java.lang.annotation.Annotati ...
- 19.Java 注解
19.Java注解 1.Java内置注解----注解代码 @Deprecated //不推荐使用的过时方法 @Deprecated ...
- Java注解入门
注解的分类 按运行机制分: 源码注解:只在源码中存在,编译后不存在 编译时注解:源码和编译后的class文件都存在(如@Override,@Deprecated,@SuppressWarnin ...
- java注解(Annotation)解析
注解(Annotation)在java中应用非常广泛.它既能帮助我们在编码中减少错误,(比如最常见的Override注解),还可以帮助我们减少各种xml文件的配置,比如定义AOP切面用@AspectJ ...
- JAVA 注解的几大作用及使用方法详解
JAVA 注解的几大作用及使用方法详解 (2013-01-22 15:13:04) 转载▼ 标签: java 注解 杂谈 分类: Java java 注解,从名字上看是注释,解释.但功能却不仅仅是注释 ...
- attilax.java 注解的本质and 使用最佳实践(3)O7
attilax.java 注解的本质and 使用最佳实践(3)O7 1. 定义pojo 1 2. 建立注解By eclipse tps 1 3. 注解参数的可支持数据类型: 2 4. 注解处理器 2 ...
- paip.java 注解的详细使用代码
paip.java 注解的详细使用代码 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.net/att ...
- JAVA 注解的几大作用及使用方法详解【转】
java 注解,从名字上看是注释,解释.但功能却不仅仅是注释那么简单.注解(Annotation) 为我们在代码中添加信息提供了一种形式化的方法,是我们可以在稍后 某个时刻方便地使用这些数据(通过 解 ...
随机推荐
- SpringBoot图文教程10—模板导出|百万数据Excel导出|图片导出「easypoi」
有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1「概念+ ...
- Enbale IE mode in Edge
1. 打开Edge, 在地址栏输入 edge://flags/ 2. 搜索 Enable IE Integration , 配置为 IE mode 3. 找到Edge的启动程序路径.如 C:\Prog ...
- 前端每日实战:7# 视频演示如何用纯 CSS 创作一个 3D 文字跑马灯特效
效果预览 按下右侧的"点击预览"按钮在当前页面预览,点击链接全屏预览. https://codepen.io/zhang-ou/pen/GdrrZq 可交互视频教程 此视频是可以交 ...
- JavaScript实现树结构(二)
JavaScript实现树结构(二) 一.二叉搜索树的封装 二叉树搜索树的基本属性: 如图所示:二叉搜索树有四个最基本的属性:指向节点的根(root),节点中的键(key).左指针(right).右指 ...
- 修改js文件,引发的404问题
记录一个bug,本地测不出来,客户后台却404,web测试可参考.(不知道是不是通用的) 先介绍下背景 我们是web产品,存在发布机.管理机.js文件,页面会引用到这些js文件.出于安全考虑,规定js ...
- windows 安装 jenkins 自动化构建部署至linux服务器上
一.环境准备 1.git安装环境 参考链接 https://www.cnblogs.com/yuarvin/p/12500038.html 2.maven安装环境,包括jdk环境安装 参考链接 htt ...
- JAVAEE学习day01
1.二进制和十进制之间的转换: 十进制转换成二进制: 除2取余,从下往上吧余数拼接 二进制转换十进制: 1 0 1 0 8 4 2 1 把有1位的十进制求和 2.JAVA语言跨平台的原理 java程序 ...
- Excel 电子表格中,快速修改表格中的数值
打开设置单元格设置选项后,当前界面,分类下面的选项中,选择“自定义”,并在右侧展示的“类型(T)”下方的对话框中,输入以下代码: [=1]√;[=2]×; 并按确认, [=1] 意思为: 将单元格中, ...
- 数学-Matrix Tree定理证明
老久没更了,冬令营也延期了(延期后岂不是志愿者得上学了?) 最近把之前欠了好久的债,诸如FFT和Matrix-Tree等的搞清楚了(啊我承认之前只会用,没有理解证明--),FFT老多人写,而Matri ...
- .Net Core 实现图片验证码
记录自己的学习,参考了网上各位大佬的技术,往往在登录的时候需要使用到验证码来进行简单的一个校验,这边使用在.net core上进行生成图片二维码 思路很简单=> 生成一个随机数->保存到服 ...