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. 【2020五校联考NOIP #2】矩阵

    咕咕咕到现在~ 题面传送门 题意: 给出一个 \(n\times n\) 的矩阵 \(A\).要你求有多少个 \(n\times n\) 的矩阵 \(B\) 满足: 每一行都是 \(1\) 到 \(n ...

  2. Codeforces 547D - Mike and Fish(欧拉回路)

    Codeforces 题目传送门 & 洛谷题目传送门 首先考虑将题目中的条件转化为图论的语言.看到"行""列",我们很自然地想到二分图中行.列转点,点转 ...

  3. YAOI Round #1 (Div.2) 题解

    总体来说很有一定区分度的(主要分为 4 题.2 题.1 题几档),ACM 赛制也挺有意思的,征求一下大家对这场比赛的意见吧,可以在这个帖子下回复,我都会看的. 简要题解:( A. 云之彼端,约定的地方 ...

  4. C++你不知道的事

    class A { public: A() { cout<<"A's constructor"<<endl; } virtual ~A() { cout&l ...

  5. Scala(一)【安装和IDEA中开发】

    目录 一.下载 二.windows安装 三.linux环境安装 四.Ida开发Scala 1.在线下载Scala插件 2.离线下载Scala插件 3.验证 五.HelloWorld入门程序 1.新建M ...

  6. Scala(二)【基本使用】

    一.变量和数据类型 1.变量 语法:val / var 变量名:变量类型 = 值 val name:String = "zhangsan" 注意 1.val定义的变量想到于java ...

  7. JS模块化,Javascript 模块化管理的历史

    模块管理这个概念其实在前几年前端度过了刀耕火种年代之后就一直被提起. 直接回想起来的就是 cmd amd commonJS 这三大模块管理的印象.接下来,我们来详细聊聊. 一.什么是模块化开发 为了让 ...

  8. C++类的定义,成员函数的定义,对象的创建与使用

    类是一个模板,可用类生成一系列可用的实例.例如 int B就是生成了一个符合int的数据B,类也是一样,使用类名就可以直接生成一个实例, 该实例中包含类中所有的数据类型和对这些数据的操作方法. 首先, ...

  9. Java文件操作(求各专业第一名的学生)

    两个文件:info.txt 存放学生基本信息 学号 学院 专业 姓名 1001 计算机学院 软件工程 刘月 1002 生物工程 服装设计 孙丽 score.txt存放分数信息 学号 学科 成绩 100 ...

  10. 查询表名和表备注(中文名) 及 dba_tables、all_tables和user_tables的区别

    1. select a.* from ALL_TAB_COMMENTS a --查表名和表中文名select a.* from ALL_TAB_COLUMNS a --查询表字段属性select a. ...