1,什么是注解:

从JDK5开始,Java增加了对元数据 (MetaData)的支持,也就是Annotation注解,这种注解与注释不一样,注解其实是代码里的特殊标记,这些标记可以在编译、类加载 运行时被读取并执行相应的处理。通过使用注解,程序开发人员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充的信息。代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证或者进行部署。
注解提供了一种为程序元素设置元数据的方法,从某些方面来看,注解就像修饰符,可用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明,这些信息被存储在注解 "name=value"对中。
注解能被用来为程序元素(类、方法、成员变量等)设置元数据。值得指出的是,注解不影响程序代码的执行,无论增加、删除注解,代码都始终如一地执,如果希望让程序中的注解在运行时起一定的作用,只有通过某种配套的工具对注解中的信息进行访问和处理,访问和处理注解的工具统称APT,也就是Annotation Processing Tool的缩写。

2,Java5的常用的基本注解:

(1),重写父类方法注解@Override:

该注解作用在一个方法上,告诉编译器检查该该方法是不是一个重写父类的方法。这个注解的作用主要是为了帮助程序员屏蔽一些低级错误,比如,我们有一个方法叫做info,有的程序员可能就直接写成了inf或者inf0,到时候排查的时候,也不太方便,如果在编译的时候就能把这个错误报出来就是最好的。
子类重写父类方法,请必须加@Override注解

(2),标记过时@Deprecated:

该注解也是作用在一个类或者方法上,表示一个类或者方法是不是已过时的,如果在其他程序里使用了已过时的类或者方法,编译器会给出警告。
java9开始为Deprecated提供了两个新的属性:
  • forRemoval: boolean 类型的属性指定该API在将来是否会被删除
  • since: String 类型的属性指定该API从哪个版本被标记为过时

(3),取消告警@SuppressWanings:

@SuppressWanings指示被该注解修饰的程序元素(以及该程序元素中的所有子元素)取消显示指定的编译器警告,@SuppressWanings一直作用于该程序元的所有子元素。
比如我们的集合框架如果没有使用泛型就会造成编译告警。不过V哥觉得,我们应该尽量不适用这个注解。我们应该解决掉程序开发中所有的告警。

(4),函数式接口@FunctionalInterface

自定义注解

元注解

元注解就是修饰注解的注解。java中定义了6个元注解。本节课我们先介绍常用的元注解。

1,@Retention

只能用于修饰注解定义,用于指定被修饰的注解的生命周期,
@Retention包含一个@RetentionPolicy类型的value成员变量,所以使用@Retention时必须为该value成员变量指定值。
value 成员变 的值只能是如下
  • RetentionPolicy.CLASS: 编译器将把注解记录在class文件中,当运行Java程序时JVM不可获取注解信息。这是默认值
  • RetentionPolicy.RUNTIM: 编译器将把注解记录在class文件中,当运行 Java程序时JVM可获取注解信息,程序可以通过反射获取该注解信息
  • RetentionPolicy.SOURCE: 注解只保留在源代码中,编译器直接丢弃这种注解
 

2,@Target

@Target 也只能修饰注解定义,它用于指定被修饰的注解能用于修饰哪些程序单元@Target 元注解也包含一个名为 value 的成员变,该成员变量的值只能是如下几个:
  • ElementType.ANNOTATION_TYPE: 指定该策略的注解只能修饰注解。
  • ElementType.CONSTRUCTOR: 定该策略的注解只能修饰构造器。
  • ElementType.FIELD: 指定该策略的注解只能修饰成员变量。
  • ElementType.LOCAL_VARIABLE: 定该策略的注解只能修饰局部变量
  • ElementType.METHOD: 指定该策略的注解只能修饰方法定义。
  • ElementType.PACKAGE: 指定该策略的注解只能修饰包定义。
  • ElementType.PARAMETER: 指定该策略注解可修饰参数
  • ElementType.TYPE: 定该策略的注解可以修饰类、接口(包括注解类型)或枚举定义

3,@Documented

@Documented 用于指定被该元注解修饰的注解类将被javadoc工具提取成文档,如果定义注解类时使用了@Documented修饰,则所有使用该注解修饰的程序元素的 API 文档中将会包含该注解说明
 

4,@Inherited

@Inherited元注解指定被它修饰的注解将具有继承性,如果某个类使用了@Xxx注解(定义该注解时使用了@Inherited修饰)修饰,则其子类将自动被@Xxx修饰。
 
 
创建注解
1,创建一个最简单的注解
public @interface MyAnnotation { }
 
2,使用刚刚创建的注解:
@MyAnnotation public class MyClass { }
在默认情况下,注解可以修饰任何的程序元素,包括我们的类,接口,方法等等。所以我们定义的MyAnnotation注解,它可以修饰任何的程序元素。
 
3,带成员变量的注解,成员变量在注解中的定义以无参方法的形式来声明
我们的注解的成员变量的类型,只能是基本数据类型和String,元数据类型,注解类型以及其对应的数组。
package com.zmd.myAnnotation;

public @interface MyAnnotation {
String name();
int age() ;
}
如果添加了成员变量,那么使用的时候可以是如下格式:
package com.zmd.myAnnotation;

@MyAnnotation(name = "hehe",age = 1)
public class MyClass {
}
4、还可以给注解的属性加上默认值:
package com.zmd.myAnnotation;

public @interface MyAnnotation {
String name() default "zmd";
int age() default 22;
}
如果加上了默认值之后,我们可以不对name和age赋值了。如果不复制,那么使用的就是默认值。
 
 

java 编程基础:注解的功能和作用,自定义注解的更多相关文章

  1. Java入门——(1)Java编程基础

    Java入门--(1)Java编程基础 第二章 Java编程基础   JAVA 代码的基本格式: 修饰符 class 类名{ 程序代码 }   2.1关键字:赋予了特殊含义的单词.   2.2标识符: ...

  2. Java基础笔记 – Annotation注解的介绍和使用 自定义注解

    Java基础笔记 – Annotation注解的介绍和使用 自定义注解 本文由arthinking发表于5年前 | Java基础 | 评论数 7 |  被围观 25,969 views+ 1.Anno ...

  3. Java开发知识之Java编程基础

    Java开发知识之Java编程基础 一丶Java的基础语法 每个语言都有自己的语法规范.例如C++ 入口点是main. 我们按照特定格式编写即可. Java也不例外. Java程序的语法规范就是 Ja ...

  4. Java编程基础-面向对象(中)

    本章承接Java编程基础-面向对象(上)一文. 一.static关键字 在java中,定义了一个static关键字,它用于修饰类的成员,如成员变量.成员方法以及代码块等,被static修饰的成员具备一 ...

  5. Java编程基础——流程控制

    Java编程基础——流程控制 摘要:本文主要介绍Java编程中的流程控制语句. 分类 流程控制指的是在程序运行的过程中控制程序运行走向的方式.主要分为以下三种: 顺序结构:从上到下依次执行每条语句操作 ...

  6. java编程基础二进制

    0.java编程基础 01.二进制(原码,反码,补码) 02.位运算 03.移位运算符 二进制 原码,反码,补码 1.基本概念 二进制是逢2进位的进位制,0,1是基本算符. 现在的电子计算机技术全部使 ...

  7. Java编程基础——数组和二维数组

    Java编程基础——数组和二维数组 摘要:本文主要对数组和二维数组进行简要介绍. 数组 定义 数组可以理解成保存一组数的容器,而变量可以理解为保存一个数的容器. 数组是一种引用类型,用于保存一组相同类 ...

  8. Java编程基础——运算符和进制

    Java编程基础——运算符和进制 摘要:本文主要介绍运算符和进制的基本知识. 说明 分类 Java语言支持如下运算符: ◆ 算术运算符:++,--,+,-,*,/,%. ◆ 赋值运算符:=,+=,-= ...

  9. Java编程基础——常量变量和数据类型

    Java编程基础——常量变量和数据类型 摘要:本文介绍了Java编程语言的常量变量和数据类型. 常量变量 常量的定义 一块内存中的数据存储空间,里面的数据不可以更改. 变量的定义 一块内存中的数据存储 ...

  10. Java编程基础——标识符和关键字

    Java编程基础——标识符和关键字 摘要:本文主要介绍标识符和关键字. 标识符 是什么 Java语言中,为各种变量.方法.类和包等起的名字,统统称之为Java标识符. 命名规则 ◆ 应以字母.下划线. ...

随机推荐

  1. (前端)面试300问之(2)CSS元素居中【水平、垂直、2者同时居中】

    一 仅水平居中 1 行内元素 1)给父元素添加 text-align:center 即可 <div class="parent"> <span class=&qu ...

  2. CF1437G Death DBMS

    题面传送门. 题意简述:给出 \(n\) 个字符串 \(s_i\),每个 \(s_i\) 初始权值为 \(0\).\(q\) 次操作:修改 \(s_i\) 的权值:查询给出字符串 \(q\) 能匹配的 ...

  3. 【R绘图】R 基础(base )低级函数legend绘图?

    ggplot虽然好用,但base才是真正的瑞士军刀,什么都能用,各种自定义图形自由组合,出版级图片用base才是王道.但要达到随心所欲,需要熟练掌握. legend是比较重要的低级函数,有很多细节处理 ...

  4. R包customLayout比例拼图

    一个简单的需求: 拼接两个图,一行两列,但不要一样大,让主图占的比例大些(如2/3),另一个图小一些(如1/3) 如上,我想突出曼哈顿图. R相关的拼图函数及包: 基础函数如par(mar =c(3, ...

  5. GO 语言使用copy 拷贝切片的问题

    使用copy,直接改变原片的值,而不是先创建一个副本.

  6. 59. Divide Two Integers

    Divide Two Integers My Submissions QuestionEditorial Solution Total Accepted: 66073 Total Submission ...

  7. Python基础之流程控制while循环

    目录 1. 语法 2. while+break 3. while+continue 4. while+else 1. 语法 最简单的while循环如下: ''' while <条件>: & ...

  8. Python基础之列表内置方法

    目录 1. 列表 1.1 序列 1.2 通用的序列操作 1.3 列表的基本操作 1.4 列表方法 1. 列表 数据结构:以某种方式(如通过编号)组合起来的元素(如数,字符乃至其他数据结构)集合. 在p ...

  9. 【NetCore】RabbitMQ 封装

    RabbitMQ 封装 代码 https://gitee.com/wosperry/wosperry-rabbit-mqtest/tree/master 参考Abp事件总线的用法,对拷贝的Demo进行 ...

  10. linux下定位异常消耗的线程实战分析

    前言: 之前分享过一篇Linux开发coredump文件分析实战分享 ,今天再来分享一篇实战文章. 在我们嵌入式linux开发过程中,开发过程中我们经常会使用多进程.多线程开发.那么多线程使用过程中, ...