注解(Annotation)是在JAVA5中开始引入的,它为在代码中添加信息提供了一种新的方式。注解在一定程度上把元数据与源代码文件结合在一起,正如许多成熟的框架(Spring)所做的那样。那么,注解到底可以做什么呢?

1、注解的作用。

  • 提供用来完整地描述程序所需要的信息,如编译期校验程序信息。
  • 生成描述符文件,或生成新类的定义。
  • 减轻编写“样板”代码(配置文件)的负担,可以使用注解自动生成。
  • 更加干净易读的代码。
  • 编译期类型检查。

2、Java提供的注解

Java5内置了一些原生的注解,它们仅次于java.lang包下(不止于此):

  • @Override,表示当前的方法定义将覆盖超类中的方法。
  • @Deprecated,标识元素为弃用的,如果程序员使用了注解为它的元素,编译器会发出警告信息。
  • @SuppressWarnings,关闭不当的编译器警告信息。

以上注解均为源码级别注解(即为RetentionPolicy.SOURCE标注,需要注意的是,虽然@Deprecated是由RetentionPolicy.CLASS标注,但是所起的作用主要还是在编译期),仅编译器可读取,编译成class将会舍弃,当然,运行时就更不会存在了。

Java还提供了一些元注解,用于自定义注解(meta-annotations),如@Target、@Retention、@SupportedSourceVersion等。java.lang.annotation包中的元注解:

@Retention 指定标识的注解如何保存。

  • RetentionPolicy.SOURCE – 注解将仅保存在源代码级别,将会被编译器丢弃。
  • RetentionPolicy.CLASS – 将会在编译时期使用,并保存在class中,但JVM不会识别此。
  • RetentionPolicy.RUNTIME – 此注解将会被JVM识别,理论上将会在任意时期都会存在。

@Documented 表明该注解标识的元素所使用的注解应该出现在javadoc中。

@Target 指定哪种JAVA元素可以使用当前定义的注解,指定类型(ElementType)如下:

  • ElementType.ANNOTATION_TYPE 注释类型声明。
  • ElementType.CONSTRUCTOR 构造方法声明。
  • ElementType.FIELD 字段声明(包括枚举常量)。
  • ElementType.LOCAL_VARIABLE 局部变量声明。
  • ElementType.METHOD 方法声明。
  • ElementType.PACKAGE 包声明。
  • ElementType.PARAMETER 参数声明。
  • ElementType.TYPE 类、接口(包括注释类型)或枚举声明。

@Inherited  指示注释类型被自动继承。如果在注释类型声明中存在 Inherited 元注释,并且用户在某一类声明中查询该注释类型,同时该类声明中没有此类型的注释,则将在该类的超类中自动查询该注释类型。此过程会重复进行,直到找到此类型的注释或到达了该类层次结构的顶层 (Object) 为止。如果没有超类具有该类型的注释,则查询将指示当前类没有这样的注释。

注意,如果使用注释类型注释类以外的任何事物,此元注释类型都是无效的。还要注意,此元注释仅促成从超类继承注释;对已实现接口的注释无效。

@Repeatable (Java8中增加)使用此注解注释的注解,在使用时是可重复使用的。注意,在Java8之前注解同一个注解在同一个元素上是不可以多次使用的。

3、定义注解

大多数时候,开发者需要自己定义注解以满足不同的需求。

定义注解,注解一般包括注解的定义、注解元素、元注解,示例如下:

package com.zenfery.example.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.TYPE)
@Retention(RetentionPolicy.CLASS)
public @interface ClassInfo {String value() default "default";
}

3.1、注解的定义

使用关键字@interface来定义,如上public @interface ClassInfo,注解的权限限定符仅支持public、default(包访问权限)。

3.2、元注解

如上@Target(ElementType.TYPE),表示注解ClassInfo可用于类、接口、或者枚举类型。

3.3、注解元素

注解元素使用类似普通方法的定义格式,如上述例子中的value(),使用default指定默认值。注解元素在使用时必须有值,要么是默认值,要么在使用注解是提供元素的值。且注解元素的值不能为null值。

注解元素的可用类型有:所有的基本类型、String、Class、enum、Annotation、以上类型的数组。如果使用复杂类型的注解,可使用注解的嵌套来实现。如果程序员的注解中定义了名为value的元素,并且在应用该注解的时候,如果该元素是唯一需要赋值的一个元素,那么此时无需使用名-值对的语法,而只需在括号内给出value元素所需的值即可。

3.4、注解不支持继承

不可使用extends关键字继承某个@interface。可以使用嵌套来实现相似的功能。

4、注解的使用

如果要使用以上的注解,可像如下这种方式使用:

package com.zenfery.example.annotation.clazz;import com.zenfery.example.annotation.ClassInfo;@ClassInfo("这是HelloAnnotation类。")
public class HelloAnnotation {
}

原文链接  https://blog.zenfery.cc/archives/70.html

转载于:https://www.cnblogs.com/wryd952532573/p/7479214.html

Java注解(1)-注解基础相关推荐

  1. java 反射泛型方法_java基础之反射和泛型以及注解

    java基础之反射和泛型以及注解 泛型擦除 泛型擦除: 泛型只在编译时期有效,编译后的字节码文件中不存在泛型信息. 声明泛型集合,集合两端类型必须一致.类型也可以用包装类型,泛型的类型必须是引用类型, ...

  2. java 注解 对象_Java基础-学习使用Annotation注解对象

    Java基础-学习使用Annotation注解对象 注解(也被称为元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某 个时刻非常方便地使用这些数据 1-1:基本语法 Java S ...

  3. java反射和注解开发(备java基础,javaee框架原理)-任亮-专题视频课程

    java反射和注解开发(备java基础,javaee框架原理)-5358人已学习 课程介绍         Java注解是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明. ...

  4. 【Java注解】注解基础

    笔记来源:IMOOC Java注解 注解的分类 按照运行机制分 源码注解:注解只在源码中存在,编译成 .class 文件就不存在了 编译时注解:注解在源码和 .class 文件中都存在 运行时注解:在 ...

  5. Java、Android注解代码生成(ButterKnife原理、ViewBinding)

    前言 首先需要一些先验知识: 浅谈Java/Android下的注解 Java.Android基础之-反射 Java.Android静态代理与动态代理 简介 在我们常用的框架中注解和自动生成代码的身影很 ...

  6. 详解Java中的注解

    在Java中,注解(Annotation)引入始于Java5,用来描述Java代码的元信息,通常情况下注解不会直接影响代码的执行,尽管有些注解可以用来做到影响代码执行. 注解可以做什么 Java中的注 ...

  7. 深入理解Java:注解(Annotation)基本概念、自定义注解、注解解析器

    深入理解Java:注解(Annotation)基本概念 什么是注解(Annotation): Annotation(注解)就是Java提供了一种元程序中的元素关联任何信息和着任何元数据(metadat ...

  8. java 注解 id_java注解

    java注解: Java 注解用于为 Java 代码提供元数据.作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的.Java 注解是从 Java5 开始添加到 Java ...

  9. java中注解的解析_全面解析Java中的注解与注释

    注解一.什么是 Annotation? (注解 or 注释)Annotation, 准确的翻译应该是 -- 注解. 和注释的作用完全不一样. Annotation 是JDK5.0及以后版本引入的一个特 ...

最新文章

  1. 开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别
  2. 我是程序员,我有对象,我还可以调用别人对象!
  3. 2002-2003 ACM-ICPC Northeastern European Regional Contest (NEERC 02)
  4. 深入理解Zuul之源码解析
  5. 权限角色管理学习(二)
  6. 上海工程技术大学c语言商店存货管理系统,商店存货管理系统.docx
  7. mysql group_concat拼接字符串长度
  8. 一次性密码本-绝对不会被破译的密码
  9. 9月书讯(下)| 开学季,读新书
  10. android实现自动触摸,Android编程开发之多点触摸(Multitouch)实现方法
  11. 《引力的动态理论》的解读-尼古拉·特斯拉
  12. Ubuntu下配置FreeRadius+L2TP+MySQL,实现限制用户流量和登录人数
  13. SX1308原厂芯片
  14. leetcode第643题C++
  15. 我的世界Mods/制作(1)
  16. [日常训练] 藏宝路径
  17. Android 10.0 进入recovery模式(等待用户选择recovery模式界面)实现自动恢复出厂设置
  18. 杜克计算机工程本科专业申请,杜克大学电气与计算机工程专业申请要求有哪些?...
  19. excel数据的导出
  20. 关于基金的各种名词含义及来源,小白如何入门基金

热门文章

  1. python爬虫基本知识_爬虫 (十三) 学习 python 基础知识点的正确姿势 (六)
  2. 哨兵模式原理_Redis哨兵、复制、集群的设计原理,以及区别
  3. python的类程序的结构_Python程序员学习路径之数据结构篇
  4. 使用计算机的优点缺点,计算机使用二进制的优缺点
  5. 不同sheet 选择若干条件_干货 | 不同加工条件下如何正确选择铣刀
  6. 解决VS2019窗体设计器不显示
  7. 如何从单个服务器扩展到百万用户的系统?
  8. memcpy函数_如何理解c语言中的回调函数
  9. js发送get、post请求的方法简介
  10. xlrd.biffh.XLRDError: Excel xlsx file; not supported报错