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. Qt5加载SVG格式的图片并更颜色

    QIcon MainWindow::qiconFromSvg(QString svg_path, QString color) { QPixmap img(svg_path); QPainter qp ...

  2. Kafka从入门到放弃(一) —— 初识Kafka

    消息中间件的使用已经越来越广泛,基本上具有一定规模的系统都会用到它,在大数据领域也是个必需品,但为什么使用它呢?一个技术的广泛使用必然有它的道理. 背景与问题 以前一些传统的系统,基本上都是" ...

  3. [NOIP2017 提高组] 宝藏

    考虑到这种对于某种操作顺序有一个权值. 且这个权值有一个\(O(n)\)或者更好的复杂度求出. 求最值. 那可以用模拟退火. #include<iostream> #include< ...

  4. 洛谷 P3214 - [HNOI2011]卡农(线性 dp)

    洛谷题面传送门 又是一道我不会的代码超短的题( 一开始想着用生成函数搞,结果怎么都搞不粗来/ll 首先不妨假设音阶之间存在顺序关系,最终答案除以 \(m!\) 即可. 本题个人认为一个比较亮的地方在于 ...

  5. 平衡树 & LCT

    1. 非旋 Treap(FHQ Treap) 1.1. 算法简介 FHQ Treap 的功能非常强大.它涵盖了 Treap 几乎所有的功能 所以我非常后悔学了 Treap,浪费时间. FHQ 的核心思 ...

  6. SSRF的原理和防范

    背景 最近做的安全测评主要是SSRF,发现自己在这一块有挺大知识盲点,抓紧补一下. 1.介绍 SSRF(Server-Side Request Forgery:服务器端请求伪造),是一种攻击者利用服务 ...

  7. Navicat 激活教程2021(Linux)

    Navicat 激活教程2021(Linux) 目录 背景 环境 激活 清理 使用 背景 Navicat 是香港卓软数字科技有限公司生产的一系列 MySQL.MariaDB.MongoDB.Oracl ...

  8. FESTUNG 模型介绍 — 2. 对流问题隐式求解

    FESTUNG 模型介绍 - 2. 对流问题隐式求解 1. 控制方程 对流问题的控制方程为 \[\partial_t C + \partial_x u^1 C + \partial_y u^2 C = ...

  9. sar 系统活动情况报告

    sar(System Activity Reporter系统活动情况报告)是目前 Linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告, 包括:文件的读写情况.系统调用的使用 ...

  10. CMakeLists.txt添加多个源代码

    coos2d-x 3.17.2 C++工程,安卓编译使用CMake,按照模板给的写法,只能一个一个源文件添加:如果需要添加大量的C++源代码,这种方式肯定不可取:原来的写法: 1 list(APPEN ...