什么是注解(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注解的更多相关文章

  1. paip。java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型

    paip.java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型 作者Attilax 艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http ...

  2. Java高级特性-String、StringBuffer和StringBuilder

    Java高级特性-String.StringBuffer和StringBuilder String Java语言中的字符串值都属于String类,虽然有其他方法表示字符串(如字符串数组),但Java一 ...

  3. java高级特性增强

    第4天 java高级特性增强 今天内容安排: 1.掌握多线程 2.掌握并发包下的队列 3.了解JMS 4.掌握JVM技术 5.掌握反射和动态代理 java多线程增强 .1. java多线程基本知识 . ...

  4. Java高级特性——反射机制(第二篇)

    在Java高级特性——反射机制(第一篇)中,写了很多反射的实例,可能对于Class的了解还是有点迷糊,那么我们试着从内存角度去分析一下. Java内存 从上图可以看出,Java将内存分为堆.栈.方法区 ...

  5. Java高级特性1_流库_初体验

    Java高级特性流库_初体验 面对结果编程 在编程里, 有两种编程方式, 一种是面对过程编程, 一种是面对结果编程. 两者区别如下 面向过程编程 面向过程编程需要编程程序让程序依次执行得到自己想要的结 ...

  6. JAVA高级特性 - 注解

    注解是插入到代码中用于某种工具处理的标签.这些标签可以在源码层次上进行操作,或者可以处理编译器将其纳入到注解类文件中. 注解不会改变对程序的编译方式.Java编译器会对包含注解和不包含注解的代码生成相 ...

  7. 云端卫士实战录 | Java高级特性之多线程

    <实战录>导语 一转眼作为一名Java开发者已经四年多时间了,说长不长说短不短,对于java的感情还是比较深的,主要嘛毕竟它给了我饭吃.哈哈,开个玩笑.今天我想借此机会来和大家聊聊Java ...

  8. Java高级特性之泛型

    首先我们先提出两个问题: 什么是泛型? 为什么要使用泛型?我们先来看看第一个问题什么是泛型.如果你对Java三大特性中的多态性理解的比较透彻的话,泛型就比较好理解了.多态性表示一个对象具备多种状态.比 ...

  9. Java高级特性 第2节 java中常用的实用类(1)

    一.Java API Java API即Java应用程序编程接口,他是运行库的集合,预先定义了一些接口和类,程序员可以直接调用:此外也特指API的说明文档,也称帮助文档. Java中常用的包: jav ...

随机推荐

  1. PDOStatement::bindParam

    PDOStatement::bindParam — 绑定一个参数到指定的变量名(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0) 说明 语法 bool PDOState ...

  2. 数据分析学习 third week (7.29~8.4)

    概率分布简介 简单地介绍下常用概率分布的理论知识. 基础概念 1.概率 概率直观上是指一个事件发生可能性大小的数量指标 概率的统计定义:在不变的条件下,重复进行$n$次试验,事件$A$发生的频率稳定在 ...

  3. Docker入坑指南之EXEC

    容器启动之后,如果我们需要进入容器内修改配置,比如mysql修改启动配置 我们启动的附加参数是不是shell,这个时候就可以用docker exec了,docker除了对image参数以外,大部分命令 ...

  4. Nginx的基本使用和配置

    2.1什么是Nginx Nginx 是一款高性能的 http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器.由俄罗斯的程序设计师伊戈尔·西索夫(Igor Sysoev)所开发,官方 ...

  5. 网络安全传输系统-sprint2线程池技术优化

    part1:线程池工作原理 为满足多客户端可同时登陆的要求,服务器端必须实现并发工作方式.当服务器主进程持续等待客户端连接时,每连接上一个客户端都需一个单独的进程或线程处理客户端的任务.但考虑到多进程 ...

  6. Navicat15安装教程

    本文内容皆为作者原创,如需转载,请注明出处:https://www.cnblogs.com/xuexianqi/p/12797170.html 一:简介 Navicat是一套快速.可靠的数据库管理工具 ...

  7. Hexo小技巧(包括如何插入本地图片)

    我在研究如何在Hexo中引用本地图片时,看到官方文档对此问题已给出了解决方法,并亲测有效.当然,我并不满足于仅仅知道这一个技巧.在大致阅读过官方文档后,我总结了之前我个人并不知道的几个关于Hexo写博 ...

  8. C语言学习笔记之数组与指针的关系

    首先,大家先需知道一个关于基类型的概念 基类型:组成一个新类型的基础类型 这句话是什么意思呢?举个例子: int a[3] = {1,2,3}; 上面是由三个int类型的数组成一个新的类型也就是数组, ...

  9. Vue 引用图片的三种方式

    首先给图片地址绑定变量 <template> <img :src="imgUrl"> </template> 在script中设置变量 < ...

  10. Secure CRT连接VMware虚拟机中的CentOS 7

    操作步骤: 1.安装Centos 7   虚拟机设置==>NetworkAdapter===>选择NAT(共享主机的IP地址), CTRL+ALT+F1切换到图形界面 选择右上角以太网打开 ...