Java学习——注解

摘要:本文主要介绍了Java开发常用的注解,以及如何自定义注解。

部分内容来自以下博客:

https://www.cnblogs.com/Qian123/p/5256084.html

https://www.cnblogs.com/xd502djj/p/2610040.html

https://www.cnblogs.com/peida/p/3036689.html

什么是注解以及为什么要使用注解

从JDK1.5开始,JAVA增加了对元数据(描述数据属性的信息)的支持。其实说白就是代码里的特殊标志,这些标志可以在编译,类加载,运行时被读取,并执行相应的处理,以便于其他工具补充信息或者进行部署。

注解的分类

按运行机制

源码注解,这种注解只在源码阶段存在存在。

编译注解,注解不但在源码中存在,而且在class文件中也存在,JDK自带的注解就是属于这种类型的注解。

运行时注解,即便到在运行阶段仍然起作用的注解,第三方提供的注解大部分是属于这种类型的注解。

按来源分类

JDK自带的注解。

第三方的注解。

自定义注解。

按功能分类

普通注解,对程序和代码进行标注的注解。

元注解,对注解标记的注解。

Java中常见的注解

JDK自带注解

@Override:表示覆盖或重写父类的方法。

@Deprecated:表示该方法已经过时了,不建议使用。

@SuppressWarnings:表示忽略指定警告。

第三方注解

有很多第三方框架会有自己的注解,比如Spring框架中的@AutoWired注解。

自定义注解

开发者自己定义的注解。

元注解

元注解的作用就是负责注解其他注解。

@Target

作用:

用于描述注解的使用范围,即被描述的注解可以用在什么地方。

取值:

ElementType.PACKAGE:包。

ElementType.TYPE:接口、类、枚举。

ElementType.FIELD:字段、枚举的常量。

ElementType.METHOD:方法。

ElementType.PARAMETER:方法参数。

ElementType.CONSTRUCTOR:构造函数。

ElementType.LOCAL_VARIABLE:局部变量。

ElementType.ANNOTATION_TYPE:注解。

@Retention

作用:

用于描述注解的生命周期,即被描述的注解在什么范围内有效。

取值:

RetentionPolicy.SOURCE:注解仅存在于源码中,在class字节码文件中不包含。

RetentionPolicy.CLASS:默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得。

RetentionPolicy.RUNTIME:注解会在class字节码文件中存在,在运行时可以通过反射获取到。

@Inherited

作用:

用于说明这个注解是可以被继承的。如果一个使用了@Inherited修饰的注解类型被用于一个class,则这个注解将被用于该class的子类。

注意:

@Inherited是会被注解标记的class的子类所继承。类并不从它所实现的接口继承注解,方法并不从它所重载的方法继承注解。

当@Inherited的注解的@Retention是RetentionPolicy.RUNTIME时,反射API会增强这种继承性。如果我们使用反射去查询一个@Inherited的注解时,反射代码检查将展开工作:检查class和其父类,直到发现指定的注解,或者到达类继承结构的顶层。

@Documented

作用:

用于描述注解可以被放到文档里。

自定义注解

使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。

@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、Enum)。可以通过default来声明参数的默认值。

自定义注解格式

  1. public @interface 注解名称 {
  2. // 若干参数
  3. 修饰符 类型 名称() default 默认值;
  4. }

注解参数

修饰符:

只能用public或默认(default)这两个访问权限修饰符。

类型:

只能用byte、short、char、int、long、float、double、boolean八种基本数据类型和String、Enum、Class、Annotations等数据类型,以及这一些类型的数组。

名称:

可以自定义,如果只有一个参数成员,最好把参数名称设为value,不要忘了后加小括号。

default 默认值:

注解元素必须有确定的值,要么在定义注解的默认值中指定,要么在使用注解时指定,非基本类型的注解元素的值不可为null。因此,使用空字符串或0作为默认值是一种常用的做法。这个约束使得处理器很难表现一个元素的存在或缺失的状态,因为每个注解的声明中,所有元素都存在,并且都具有相应的值,为了绕开这个约束,我们只能定义一些特殊的值,例如空字符串或者负数,表示某个元素不存在,在定义注解时,这已经成为一个习惯用法。

自定义注解并使用

自定义注解代码如下:

  1. @Target({ElementType.METHOD, ElementType.PACKAGE, ElementType.TYPE})
  2. @Retention(RetentionPolicy.SOURCE)
  3. @Documented
  4. @Inherited
  5. public @interface TestAnnotation {
  6. public String value() default "";
  7. public String name();
  8. public int age();
  9. }

使用注解的代码如下:

  1. @TestAnnotation(age = 0, name = "")
  2. public class Demo {
  3. public static void main(String[] args) {
  4. System.out.println();
  5. }
  6. }

Java学习——注解的更多相关文章

  1. Java 学习 注解

    转载:https://blog.csdn.net/briblue/article/details/73824058 注解语法 因为平常开发少见,相信有不少的人员会认为注解的地位不高.其实同 class ...

  2. Java学习之注解Annotation实现原理

    前言: 最近学习了EventBus.BufferKinfe.GreenDao.Retrofit 等优秀开源框架,它们新版本无一另外的都使用到了注解的方式,我们使用在使用的时候也尝到不少好处,基于这种想 ...

  3. 0035 Java学习笔记-注解

    什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...

  4. Java学习:注解,反射,动态编译

    狂神声明 : 文章均为自己的学习笔记 , 转载一定注明出处 ; 编辑不易 , 防君子不防小人~共勉 ! Java学习:注解,反射,动态编译 Annotation 注解  什么是注解 ? Annotat ...

  5. java自定义注解学习(二)_注解详解

    上篇文章,我们简单的实现了一个自定义注解,相信大家对自定义注解有了个简单的认识,这篇,这样介绍下注解中的元注解和内置注解 整体图示 内置注解 @Override 重写覆盖 这个注解大家应该经常用到,主 ...

  6. Java学习之==>注解

    一.概述 关于注解,首先引入官方文档的一句话:Java 注解用于为 Java 代码提供元数据.作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的.接下我将从注解的定义. ...

  7. Java学习之注解篇

    Java学习之注解篇 0x00 前言 续上篇文章,这篇文章就来写一下注解的相关内容. 0x01 注解概述 Java注解(Annotation)又称Java标注,是JDK5.0约会的一种注释机制. 和J ...

  8. Java学习记录-注解

    注解 一.org.springframework.web.bind.annotation ControllerAdviceCookieValue : 可以把Request header中关于cooki ...

  9. Java学习_注解

    使用注解 注解是放在Java源码的类.方法.字段.参数前的一种特殊"注释". 1 // this is a component: 2 @Resource("hello&q ...

随机推荐

  1. CSS边框使用-基础

    前端开发工作中经常会碰到奇形怪状的图形,当然也少不了UI设计童鞋的脑洞和创意啦,初级的开发人员可能会选择使用图片做背景加上位置属性实现,不过很多时候,CSS能实现的就不要再动用PS等工具了,时间宝贵, ...

  2. linux远程Windows服务器

    Rdesktop -f  ip 端口 Ctrl+alt+enter退出全屏

  3. Linux—主机扫描工具(Nmap)

    Nmap包含五项基本功能: 主机探测 (Host Discovery) 端口扫描 (Port Scanning) 版本检测 (Version Detection) 操作系统侦测 (Operating ...

  4. caffe初体验

    caffe是一个深度学习的框架, 具体我也不太清楚, 可以自行百度吧, 我也是刚刚知道有这么一个框架, 才疏学浅啊. 在安装完caffe, 我的第一个想法就是, 别管他是个啥东西, 总得先让我运行一些 ...

  5. HTML简介 页面标记

    HTML简介 HTML 1.0 : 1993年 HTML 2.0 : 1995年 HTML 3.2 : 1997年 HTML 4.01 : 1999年 HTML  5 : 2008年 XML:可扩展标 ...

  6. ini_set()

    ini_set ( string $varname , string $newvalue ) : string 设置指定配置选项的值.这个选项会在脚本运行时保持新的值,并在脚本结束时恢复. 参数 va ...

  7. 43 树莓派安装pytorch

    狗狗 https://www.pytorchtutorial.com/pytorch-c-api-4-cat-dog-classifier-2/ 鲜花分类器 https://www.pytorchtu ...

  8. hasattr、getattr、setattr、delattr、反射

    目录 hasattr getattr setattr delattr 反射的应用 __import__(了解) 思考: 在做程序开发中,我们常常会遇到这样的需求:需要执行对象里的某个方法,或需要调用对 ...

  9. CF1041C Coffee Break

    CF1041C Coffee Break 题目大意: 给定nn个数和一个kk,这nn个数都不超过mm 每次从没被去掉的数里面选一个数aa,去掉aa,然后可以任意一个b(b>a+k)b(b> ...

  10. 调试九法: 软硬件错误的排查之道 (David J. Agans 著)

    第1章 简介 (已看) 第2章 总体规则 (已看) 第3章 理解系统 (已看) 第4章 制造失败 第5章 不要想, 而要看 第6章 分而治之 第7章 一次只改一个地方 第8章 保持审计跟踪 第9章 检 ...