1.注解是什么?

注解,元数据的一种形式,提供与程序有关的数据,但又不是程序的一部分。注解对它们注解的代码操作没有直接影响。

附注:元数据是指用来描述数据的数据,更通俗一点,就是描述代码间关系,或者代码与其他资源(例如数据库表)之间内在联系的数据。在Java中,使用Annotation的概念来描述元数据。元数据以标签的形式存在于java代码中,元数据标签的存在并不影响程序代码的编译和执行。

2.注解有什么用?

    • 给编译器提供信息——注解可以被编译器用来检测错误和抑制警告。
    • 编译时和部署时处理——软件工具处理注解信息生成代码、XML文件等等
    • 运行时处理——一些注解适用于在运行时检查。

3.注解被用于哪些地方?

注解可以应用于声明:类,字段,方法,以及其他程序元素的声明。

声明的类上:

  1. @Entity
  2. public class Person{...}

字段上:

  1. public class Person{
  2.  
  3. @NotNull
  4. private String name;
  5.  
  6. }

方法上:

  1. @Override
  2. public String toString(){...}

Java SE 8 发行版,注解也可以应用于使用的类型。下面是一些例子:

创建类实例的表达式中:

  1. new @Inner InnerObject();

类型转换中:

  1. String value = (@NotNull String) jsonObject;

implements语句中:

  1. class UnmodifiableList<T> implements @Readonly List<@Readonly T> { ... }

声明抛出的异常中:

  1. void doWork() throws @BaseServiceException ChannelException { ... }

像这种形式的注解,称为“类型注解”

4.我们如何使用它?

4.1.声明注解

语法:

  1. [public/abstract] @interface Xxx{
  2. [public/abstract] [dataType] xx();
  3. [public/abstract] [dataType] xx() default x;
  4. }

示例:

  1. package org.springmorning.demo.javabase.annotation;
  2.  
  3. /**
  4. * @author 春晨
  5. * @date 2019/1/8 9:30
  6. * Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10234764.html
  7. */
  8. public @interface Name {
  9. //名字
  10. String first();
  11. //姓氏
  12. String last();
  13. }

一、这种没有注解类型元素的注解,我们称之为标记注解类型(a marker annotation type),如下例的@Identifier注解;

  1. package org.springmorning.demo.javabase.annotation;
  2.  
  3. /**
  4. * @author 春晨
  5. * @date 2019/1/8 8:58
  6. * Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10234764.html
  7. */
  8. public @interface Identifier {
  9. }

二、这种只有一个注解类型元素的注解,我们称之为单元素注解类型(a single-element annotation type),如下例的@Age注解;

三、定义注解类型元素时,可以设置默认值,如上例中的@Age注解;

  1. package org.springmorning.demo.javabase.annotation;
  2.  
  3. /**
  4. * @author 春晨
  5. * @date 2019/1/7 19:56
  6. * Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10234764.html
  7. */
  8. public @interface Age {
  9. /**
  10. * 声明有默认值的注解属性
  11. */
  12. String value() default "N/A";
  13. }

注意:单元素注解,根据惯例,元素名称为value,如果注解类型元素名称为value,在使用它的时候可以省略名字;否则的话,名字不能省略。如下面示例,Magazine类中对age字段使用@Age注解,就省略了value名称。

四、注解声明的语法,允许除方法声明之外的其他元素声明,如下示例,声明注解要使用的枚举:

  1. package org.springmorning.demo.javabase.annotation;
  2.  
  3. /**
  4. * @author 春晨
  5. * @date 2019/1/8 9:06
  6. * Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10234764.html
  7. */
  8. public @interface Sex {
  9. enum SEX { MALE, FEMALE }
  10. SEX value();
  11. }

五、在使用注解时,声明的类、方法、变量等其他程序元素上面可以有多个注解,如下面示例中对Magazine类中的age字段就使用了@Age注解和@SuppressWarning注解:

六、声明注解的元素,只能是以下类型:

  • 所有基本类型(boolean,char,byte,short,int,long,float,double)
  • String
  • Class
  • enum
  • Annotation
  • 以上类型的数组类型

如下面示例中,Description注解里面元素的类型就包括String、long、enum对象Version、String数组和Class这几种;

七、要想使@Description出现在Javadoc-generated文档中,你必须用@Documented注解给@Description注解定义。

  1. package org.springmorning.demo.javabase.annotation;
  2.  
  3. /**
  4. * @author 春晨
  5. * @date 2019/1/7 14:01
  6. * Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10234764.html
  7. */
  8. public @interface Author {
  9. Name name();
  10. }

以下声明一个要示例中要使用的枚举:

  1. package org.springmorning.demo.javabase.annotation;
  2.  
  3. /**
  4. * @author 春晨
  5. * @date 2019/1/7 17:19
  6. * Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10234764.html
  7. */
  8. public enum Version {
  9.  
  10. V_1_0("1.0"), V_2_0("2.0");
  11.  
  12. public String getVersion() {
  13. return version;
  14. }
  15.  
  16. public void setVersion(String version) {
  17. this.version = version;
  18. }
  19.  
  20. private String version ;
  21.  
  22. private Version(String version) {
  23. this.version = version;
  24. }
  25.  
  26. }
  1. package org.springmorning.demo.javabase.annotation;
  2.  
  3. import java.lang.annotation.Documented;
  4.  
  5. /**
  6. * @author 春晨
  7. * @date 2019/1/7 17:08
  8. * Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10234764.html
  9. */
  10. interface Formatter {}
  11.  
  12. class CommonFormat implements Formatter {}
  13. class SpecificFormat implements Formatter{}
  14.  
  15. @Documented
  16. public @interface Description {
  17. //作者
  18. Author author();
  19. //日期
  20. long date();
  21. //版本
  22. Version version() default Version.V_1_0;
  23. //上次修改时间
  24. String lastModified() default "N/A";
  25. //由谁修改
  26. String lastModifiedBy() default "";
  27. //贡献者
  28. String[] contributors();
  29. //优先使用的打印格式
  30. Class<? extends Formatter> prettyPrinter();
  31. }
  1. package org.springmorning.demo.javabase.annotation;
  2.  
  3. /**
  4. * @author 春晨
  5. * @date 2019/1/7 13:59
  6. * Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10234764.html
  7. */
  8. @Description(
  9. author = @Author(name=@Name(first = "晨", last = "春")),
  10. date = 20190102,
  11. version = Version.V_2_0,
  12. lastModified = "2019-01-07 08:11:22",
  13. lastModifiedBy = "张三",
  14. contributors = {"张三","李四"},
  15. prettyPrinter = CommonFormat.class
  16. )
  17. public class Magazine {
  18.  
  19. @Identifier
  20. private String id;
  21.  
  22. @Author(name=@Name(first = "四", last = "李"))
  23. private String author;
  24.  
  25. @Age("12")
  26. @SuppressWarnings("unchecked")
  27. private int age;
  28.  
  29. @Sex(Sex.SEX.MALE)
  30. private String sex;
  31.  
  32. @Override
  33. public String toString(){
  34. return super.toString();
  35. }
  36. }

4.2 预定义注解

Java SE API预定义了一系列的注解类型,这些注解根据其中一些注解类型用于Java编译器,另一些用于其他注解,如以上示例中@Document、@Override和@SuppressWarnings注解。

Java SE 8,预定义的注解有:@Target、@Retention、@Documented、@Inherited、@Repeatable、@Override、@SuppressWarnings、@Deprecated、@SafeVarargs和@FunctionalInterface这十种。

其中,我们把@Target、@Retention、@Documented、@Inherited、@Repeatable这五种注解,称为“元注解”,Java中的元注解专职负责注解其他注解的,用来标示其他注解的适用范围和作用域。

5. 下节继续

下节将给大家讲解,元注解@Target的使用。

认识Java注解的更多相关文章

  1. Java注解

    Java注解其实是代码里的特殊标记,使用其他工具可以对其进行处理.注解是一种元数据,起到了描述.配置的作用,生成文档,所有的注解都隐式地扩展自java.lang.annotation.Annotati ...

  2. 19.Java 注解

    19.Java注解 1.Java内置注解----注解代码 @Deprecated                                    //不推荐使用的过时方法 @Deprecated ...

  3. Java注解入门

    注解的分类   按运行机制分:   源码注解:只在源码中存在,编译后不存在 编译时注解:源码和编译后的class文件都存在(如@Override,@Deprecated,@SuppressWarnin ...

  4. java注解(Annotation)解析

    注解(Annotation)在java中应用非常广泛.它既能帮助我们在编码中减少错误,(比如最常见的Override注解),还可以帮助我们减少各种xml文件的配置,比如定义AOP切面用@AspectJ ...

  5. JAVA 注解的几大作用及使用方法详解

    JAVA 注解的几大作用及使用方法详解 (2013-01-22 15:13:04) 转载▼ 标签: java 注解 杂谈 分类: Java java 注解,从名字上看是注释,解释.但功能却不仅仅是注释 ...

  6. attilax.java 注解的本质and 使用最佳实践(3)O7

    attilax.java 注解的本质and 使用最佳实践(3)O7 1. 定义pojo 1 2. 建立注解By eclipse tps 1 3. 注解参数的可支持数据类型: 2 4. 注解处理器 2 ...

  7. paip.java 注解的详细使用代码

    paip.java 注解的详细使用代码 作者Attilax 艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.net/att ...

  8. JAVA 注解的几大作用及使用方法详解【转】

    java 注解,从名字上看是注释,解释.但功能却不仅仅是注释那么简单.注解(Annotation) 为我们在代码中添加信息提供了一种形式化的方法,是我们可以在稍后 某个时刻方便地使用这些数据(通过 解 ...

  9. 框架基础——全面解析Java注解

    为什么学习注解? 学习注解有什么好处? 学完能做什么? 答:1. 能够读懂别人写的代码,特别是框架相关的代码: 2. 让编程更加简洁,代码更加清晰: 3. 让别人高看一眼. spring.mybati ...

  10. Java注解配置

    Java注解是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能.注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用.包含在 java.lang.annota ...

随机推荐

  1. $\mathcal{Crypto}$ 共模攻击原理实现以及$\mathcal{CRT}$优化

    \(\mathcal{共模攻击概述}\) 共模攻击是一种攻击 \(\mathcal{RSA}\) 加密的技术,当两个密文使用相同的 \(\mathcal{RSA}\) 公共模数时,攻击者可以使用中国剩 ...

  2. PyQt5学习 (4)--QAbstractButton(下)

    QAbstractBUtton:   所有按钮控件的基类   提供按钮的通用功能   继承自QWidget   属于抽象类别,不能直接去使用,必须借助于子类(除非你觉得子类不够用,想自定义一个按钮) ...

  3. 迁移学习(DCCL)《Domain Confused Contrastive Learning for Unsupervised Domain Adaptation》

    论文信息 论文标题:Domain Confused Contrastive Learning for Unsupervised Domain Adaptation论文作者:Quanyu Long, T ...

  4. AI开发实践:关于停车场中车辆识别与跟踪

    摘要:本案例我们使用FairMOT进行车辆检测与跟踪.yolov5进行车牌检测.crnn进行车牌识别,在停车场入口.出口.停车位对车辆进行跟踪与车牌识别,无论停车场路线多复杂,小车在你掌控之中! 本文 ...

  5. 介绍一个.Net远程日志组件

    对于软件开发的阶段和正式运行阶段,我们都需要查看日志来诊断出现的问题.不过,在查看日志时需要登录服务器,找到特定的日志文件,再查看其中的内容,这显然不是很方便. 为了解决这个问题,我们可以使用远程日志 ...

  6. HDCTF_2023

    pwnner 附件 有后门函数,seed是一个固定值, //伪随机数 #include <stdio.h> #include <stdlib.h> int main() { i ...

  7. java调用https接口导入证书认证

    1.获取证书 浏览器访问需要调用的接口路径 如图导出证书. 2.进入java目录 jre/lib/security 导入证书 keytool -import -alias name -keystore ...

  8. vue2项目中调取登录接口登录以后获取个人信息以后,储存在哪里,怎么在不同的页面展示想要的信息?

    在Vue2项目中,可以将个人信息存储在Vuex状态管理中或者浏览器的本地存储中,具体取决于项目的需求和规模. 1. Vuex状态管理 在Vuex中定义一个user模块,用于存储用户信息,可以在登录成功 ...

  9. Git代码提交规范

    1. 引言 思想,因人而异,难以重复 写代码时,每个人的习惯是不一样的,所以,引入了代码规范,为了省力,引入了自动格式化代码工具,前端工程中比较典型的自动格式化代码工具如:Prettier · Opi ...

  10. 【解决办法】配置banner信息时卡死/无反应,以及正确配置

    环境: 工具:锐捷EVE模拟器 远程工具:SecureCRT 系统版本:Windows 10 问题描述 描述:在配置登录 banner 提示警告信息时,将 "^" 符号放到了警告信 ...