Java高级特性———Java注解
什么是注解(Annotation)?
注解是放在Java源码的类、方法、字段、参数上的一种标签,在Java SE 5.0版本中开始引入。注解同class和interface一样,也属于一种类型。
如何定义注解?
通过关键字@interface去定义,基本的使用方法如下:
@interface +注解名{} //注解定义规则
//例:创建一个名称为testAnnotation的注解
public @interface testAnnotation{
}
通过定义注解,可观察到注解相比于接口类的定义,前面多了一个“@”符号。
以上的代码可以理解为:创建了一个名称为testAnnotation的注解。
如何应用注解?
上边创建完注解以后,如何去使用注解?根据注解的定义,我们可以了解到注解可以放置到类、方法、字段或者是参数上。下面是一个注解的使用案例:
//在方法test上使用testAnnotation注解
@testAnnotation
public static void test() { } //定义名称为testAnnotation的注解
@interface testAnnotation{ }
要想注解能够正常的工作,我们还需要明白Java中的元注解。在讲元注解前,我们需要理解注解中如何定义注解的属性。
何为注解的属性?
注解的属性也叫做成员变量。注解只有成员变量,没有方法。注解的成员变量在注解的定义中以“无形参的方法”形式来声明,其方法名定义了该成员变量的名字,其返回值定义了该成员变量的类型。
如何定义注解属性?
属性的定义: 类型+属性名() +[default +"默认值"];(其中[ ]括号内的为可要可不要部分)
下面是定义注解的属性的案例:
//定义名称为testAnnotation的注解
@interface testAnnotation{
/**
* 注解的属性:
*1.定义属性:类型+属性名();
*2.为属性指定默认值:通过default关键字。(例如:int id() default 0)
**/ //定义属性名为id的属性,其默认值为0
int id() default 0; }
Tip:在注解中定义属性时它的类型必须是 8 种基本数据类型外加 类、接口、注解及它们的数组。 思考如何使用带有属性的注解,且如何给属性赋值? 通常我们在使用注解的时候,在后边跟上一个英文括号,在括号里边给每个注解的属性赋值,然后使用逗号分隔各个属性值。赋值的方式我们通过:属性名=值。
例如:
//使用注解,并为id属性赋值
@testAnnotation(id=0)
public static void test() { } //定义名称为testAnnotation的注解
@interface testAnnotation{
/**
* 注解的属性:
*1.定义属性:类型+属性名();
*2.为属性指定默认值:通过default关键字。(例如:int id() default 0)
**/ //定义属性名为id的属性,其默认值为0
int id() default 0; }
另外,还有一种情况。如果一个注解内仅仅只有一个名字为 value 的属性时,应用这个注解时可以直接接属性值填写到括号内。
例如:
//使用注解,并为value属性赋值
@testAnnotation("hgqin")
public static void test() { } //定义名称为testAnnotation的注解
@interface testAnnotation{
/**
* 注解的属性:
*1.定义属性:类型+属性名();
*2.为属性指定默认值:通过default关键字。(例如:int id() default 0)
**/ //定义属性名为id的属性,其默认值为0
int id() default 0;
String value(); }
何为元注解?
元注解是可以注解到注解上的注解,或者说元注解是一种基本注解,但是它能够应用到其它的注解上面。
如果难于理解的话,你可以这样理解。元注解也是一张标签,但是它是一张特殊的标签,它的作用和目的就是给其他普通的标签进行解释说明的。
元注解有 @Target、@Retention、@Documented、@Inherited、@Repeatable 5 种。(需要重点记忆)
逐个分析元注解:
@Target:Target 是目标的意思,@Target 指定了注解运用的范围。你可以简单的理解为@Target标签指定了自定义注解使用的场景(比如类上或者方法上等)。
@Target的取值有:
- ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
- ElementType.CONSTRUCTOR 可以给构造方法进行注解
- ElementType.FIELD 可以给属性进行注解
- ElementType.LOCAL_VARIABLE 可以给局部变量进行注解
- ElementType.METHOD 可以给方法进行注解
- ElementType.PACKAGE 可以给一个包进行注解
- ElementType.PARAMETER 可以给一个方法内的参数进行注解
- ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举
@Retention:Retention 的英文意为保留期的意思。当 @Retention 应用到一个注解上的时候,它解释说明了这个注解的的存活时间。
它的取值如下:
- RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
- RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。
- RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。
@Document:Document 的英文意为文档的意思。顾名思义,这个元注解肯定是和文档有关。它的作用是能够将注解中的元素包含到 Javadoc 中去。
@Inherit :Inherited 是继承的意思,但是它并不是说注解本身可以继承,而是说如果一个超类被 @Inherited 注解过的注解进行注解的话,那么如果它的子类没有被任何注解应用的话,那么这个子类就继承了超类的注解。
@Repeatable:Repeatable 自然是可重复的意思。@Repeatable 是 Java 1.8 才加进来的,所以算是一个新的特性。
如何完整的定义一个注解?
例如:
//使用注解,并为id属性赋值
@testAnnotation("hgqin")
public static void test() { } @Target(ElementType.METHOD) //定义使用范围为方法上
@Retention(RetentionPolicy.RUNTIME) //定义存活时间为运行时
@Documented //可文档
@Inherited //继承
//定义名称为testAnnotation的注解
@interface testAnnotation{
/**
* 注解的属性:
*1.定义属性:类型+属性名();
*2.为属性指定默认值:通过default关键字。(例如:int id() default 0)
**/ //定义属性名为id的属性,其默认值为0
int id() default 0;
String value(); }
常见的内置注解有哪些?
1.@Override:定义在java.lang.Override包中,此注解只用于修饰方法,表示一个方法声明打算重写超类中的另一个方法声明。
2.@Deprecated:定义在java.lang.Deprecated包中,此注解可以用来修饰构造器、字段、类、方法、包、属性等。
- 注释@Deprecated的程序元素是程序员不鼓励使用的程序元素,通常是因为它是危险的,或者因为存在更好的替代方法。 编译器在不被弃用的代码中使用或覆盖不推荐使用的程序元素时发出警告。
3.@SupressWarnings:定义在java.lang.SupressWarnings包中, 此注解可以用来修饰类、构造器、方法、字段等。用来抑制编译时的警告信息。
>与前两个不同,需要传入一个参数才能使用,这些参数都是提前定义好的,使用方法有下面几种方式:
(1)@SupressWarnings(“all”)
(2)@SupressWarnings("unchecked")
(3)@SupressWarnings(value="{"unchecked","deprecation"}")
(4)等等...
Java高级特性———Java注解的更多相关文章
- paip。java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型
paip.java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http ...
- Java高级特性-String、StringBuffer和StringBuilder
Java高级特性-String.StringBuffer和StringBuilder String Java语言中的字符串值都属于String类,虽然有其他方法表示字符串(如字符串数组),但Java一 ...
- java高级特性增强
第4天 java高级特性增强 今天内容安排: 1.掌握多线程 2.掌握并发包下的队列 3.了解JMS 4.掌握JVM技术 5.掌握反射和动态代理 java多线程增强 .1. java多线程基本知识 . ...
- Java高级特性——反射机制(第二篇)
在Java高级特性——反射机制(第一篇)中,写了很多反射的实例,可能对于Class的了解还是有点迷糊,那么我们试着从内存角度去分析一下. Java内存 从上图可以看出,Java将内存分为堆.栈.方法区 ...
- Java高级特性1_流库_初体验
Java高级特性流库_初体验 面对结果编程 在编程里, 有两种编程方式, 一种是面对过程编程, 一种是面对结果编程. 两者区别如下 面向过程编程 面向过程编程需要编程程序让程序依次执行得到自己想要的结 ...
- JAVA高级特性 - 注解
注解是插入到代码中用于某种工具处理的标签.这些标签可以在源码层次上进行操作,或者可以处理编译器将其纳入到注解类文件中. 注解不会改变对程序的编译方式.Java编译器会对包含注解和不包含注解的代码生成相 ...
- 云端卫士实战录 | Java高级特性之多线程
<实战录>导语 一转眼作为一名Java开发者已经四年多时间了,说长不长说短不短,对于java的感情还是比较深的,主要嘛毕竟它给了我饭吃.哈哈,开个玩笑.今天我想借此机会来和大家聊聊Java ...
- Java高级特性之泛型
首先我们先提出两个问题: 什么是泛型? 为什么要使用泛型?我们先来看看第一个问题什么是泛型.如果你对Java三大特性中的多态性理解的比较透彻的话,泛型就比较好理解了.多态性表示一个对象具备多种状态.比 ...
- Java高级特性 第2节 java中常用的实用类(1)
一.Java API Java API即Java应用程序编程接口,他是运行库的集合,预先定义了一些接口和类,程序员可以直接调用:此外也特指API的说明文档,也称帮助文档. Java中常用的包: jav ...
随机推荐
- Django学习路2
1.导入 Django 工程时 在 manage.py 上一级目录导入 2.Add local 本地 Add Remote 远端 3.BASE_DIR 项目所在目录的绝对路径 4.SECRET_KEY ...
- 每日一道 LeetCode (2):整数反转
题目:整数反转 题目来源:https://leetcode-cn.com/problems/reverse-integer 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示 ...
- GitOps初阶指南:将DevOps扩展至K8S
本文转自Rancher Labs 在过去十年的编程中,出现了一些革命性的转变.其中之一是源于围绕DevOps的实践,它将开发和运维团队整合到一个共享的工作流程中,此外还有持续集成和持续交付(CI/CD ...
- PHP timezone_name_get() 函数
------------恢复内容开始------------ 实例 返回时区的名称: <?php$tz=timezone_open("Europe/Paris");echo ...
- C/C++编程笔记:C语言错误处理方法!如何更好地处理程序的错误?
C语言被忽视的一些小东西!C语言基础教程之错误处理. C 语言不提供对错误处理的直接支持,但是作为一种系统编程语言,它以返回值的形式允许您访问底层数据.在发生错误时,大多数的 C 或 UNIX 函数调 ...
- 从入门到熟悉HTTPS的9个问题
原文:bestswifter https://juejin.im/post/58c5268a61ff4b005d99652a Q1: 什么是 HTTPS? BS: HTTPS 是安全的 HTTP ...
- 关于json 是字符串还是对象的问题
是用ajax提交的时候,json应该是字符串形式: 响应的内容,根据设置处理不同,可能是对象形式:也可能是字符串形式. 如果是字符串形式,可转化成对象形式 再进行处理. 以下常用的几个转换函数:看名字 ...
- 【JZOJ4725】质数序列 题解(数学)
题目大意:质数序列是指这个序列中任意两个数的和均为质数.先给出一个序列${a_{n}}$,从中取出元素构成最长质数序列,问其长度并输出序列.若长度相同则求和最大的序列.保证答案唯一. -------- ...
- Go:内存管理与内存清理
Illustration created for "A Journey With Go", made from the original Go Gopher, created by ...
- JVM系列之:从汇编角度分析NullCheck
目录 简介 一个普通的virtual call 普通方法中的null check 反优化的例子 总结 简介 之前我们在讲Virtual call的时候有提到,virtual call方法会根据传递的参 ...