Annotation(注解)是什么?

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

1、Annotation的定义

首先看一下如何定义我们自己的注解,下面是SpringMvc中RequestParam注解的定义。

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> @Retention(RetentionPolicy.RUNTIME) // 注解的保留策略
@Target(ElementType.PARAMETER)  // 注解的作用目标
@Documented
public @ interface RequestParam {  // 使用@interface定义注解
    String value() default "" ;  // 类似方法的属性
    boolean required() default true ;  // 使用default指定属性的默认值
    String defaultValue() default ValueConstants.DEFAULT_NONE;
}

使用方式如下:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> void deleteUser(@RequestParam(value = " id " ,required = false ) Long id)  { }

2、元注解

元注解是指注解的注解。包括  @Retention @Target @Document @Inherited四种。

2.1、@Retention: 定义注解的保留策略

@Retention(RetentionPolicy. SOURCE)   注解仅存在于源码中,在class字节码文件中不包含
@Retention(RetentionPolicy. CLASS)       默认的保留策略, 注解会在class字节码文件中存在,但运行时无法获得,
@Retention(RetentionPolicy.RUNTIME)   注解会在class字节码文件中存在,在运行时可以通过反射获取到

2.2、@Target:定义注解的作用目标

@Target(ElementType.TYPE)   接口、类、枚举、注解
@Target(ElementType.FIELD)  字段、枚举的常量
@Target(ElementType.METHOD)  方法
@Target(ElementType.PARAMETER) 方法参数
@Target(ElementType.CONSTRUCTOR)  构造函数
@Target(ElementType.LOCAL_VARIABLE) 局部变量
@Target(ElementType.ANNOTATION_TYPE) 注解
@Target(ElementType.PACKAGE)  包

2.3、@Document:说明该注解将被包含在javadoc中

2.4、@Inherited:说明子类可以继承父类中的该注解

3、通过反射读取注解

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> package java.lang.reflect;
import java.lang.annotation.Annotation;

public interface AnnotatedElement {
    /** 判断该元素中某个注解类型是否存在 */
     boolean isAnnotationPresent(Class <? extends Annotation > annotationClass);

/** 获得该元素中某个注解类型的注解 */
    < T extends Annotation > T getAnnotation(Class < T > annotationClass);

/** 获得该元素中所有可见的注解,包含继承得到的注解 */
    Annotation[] getAnnotations();

/** 获得该元素自身什么的注解,不包含继承得到的注解 */
    Annotation[] getDeclaredAnnotations();
}

java.lang.Package
java.lang.Class
java.lang.reflect.Construtor
java.lang.reflect.Field
java.lang.reflect.Method
均实现了该接口,所以我们可以通过反射获取到 Class、Construtor、Field、Mehtod等,然后再通过上述接口方法,获得作用在这些元素上的注解。
下面是RequestParam注解的使用,为便于演示,略作修改,见org.springframework.web.bind.annotation.support.HandlerMethodInvoker源码

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> Method handlerMethod = ***** ;
Annotation[] paramAnns = handlerMethod.getParameterAnnotations();

String paramName = null ;
boolean required = false ;
String defaultValue = null ;

for (Annotation paramAnn : paramAnns) {
    if (RequestParam. class .isInstance(paramAnn)) {
        RequestParam requestParam = (RequestParam) paramAnn;
        paramName = requestParam.value();
        required = requestParam.required();
        defaultValue = parseDefaultValueAttribute(requestParam.defaultValue());
        annotationsFound ++ ;
    }
       // *******其他处理*******************            
}

4、常见注解的说明及使用

@Override :@Target(ElementType.METHOD)   @Retention(RetentionPolicy.SOURCE)  说明方法是对父类方法的覆盖,用于编译器编译时进行检查
@Deprecated: @Documented  @Retention(RetentionPolicy.RUNTIME)   用于建议不要使用某元素
@SuppressWarnings:@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) @Retention(RetentionPolicy.SOURCE) 
    说明对被批注的代码元 素内部的某些警告保持静默

Annotation(注解)是什么?相关推荐

  1. java 中的 Annotation 注解学习笔记

    java 中的 Annotation 注解 什么是注解 元注解 @Target @Retention @Document @Inherited 自定义注解 什么是注解 Annotation 是从JDK ...

  2. 声明属性Hibernate的Annotation注解

    工作之余抽点时间出来写写博文,希望对新接触的朋友有帮助.今天在这里和大家一起学习一下声明属性 当项目变得比较大的时候,如何还应用hbm.xml文件来配置Hibernate实体就会变得比较复杂.这里Hi ...

  3. Java反射学习总结五(Annotation(注解)-基础篇)

    Annotation(注解)简单介绍: 注解大家印象最深刻的可能就是JUnit做单元測试,和各种框架里的使用了. 本文主要简介一下注解的用法,下篇文章再深入的研究. annotation并不直接影响代 ...

  4. hibernate annotation注解方式来处理映射关系

    2019独角兽企业重金招聘Python工程师标准>>> 在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式,熟 ...

  5. java bean 工厂模式_通过annotation(注解)实现BeanFactory工厂模式(三)

    工厂模式是大家熟知的一种设计模式,在spring BeanFactory将这模式运用自如. 前面讲过如果通过xml配置的方式实现,今天我们来讲讲如何通过注解的方式实现工厂模式. 主要思路 扫描clas ...

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

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

  7. java 数据校验框架_自己写的基于java Annotation(注解)的数据校验框架

    JavaEE6中提供了基于java Annotation(注解)的Bean校验框架,Hibernate也有类似的基于Annotation的数据校验功能,我在工作中,产品也经常需要使 用数据校验,为了方 ...

  8. 【修真院Java小课堂】Annotation注解

    标题: [修真院Java小课堂]Annotation注解 开场语: 大家好,我是IT修真院西安分院第三期学员,一枚正直纯洁善良的JAVA程序员,今天给大家分享一下,修真院官网JAVA任务七,深度思考中 ...

  9. Annotation,注解

    1.注解,或者叫做 注释,英语单词:annotation 注解的作用是什么呢? 2.注解annotation是一种引用数据类型.编译之后也是生成xxx.class文件 3.怎么自定义注解呢?语法格式? ...

  10. Annotation(注解)概述

    从JDK1.5开始, Java增加了对元数据(MetaData)的支持,也就是 Annotation(注解). Annotation其实就是代码里的特殊标记,它用于替代配置文件,也就是说,传统方式通过 ...

最新文章

  1. 如何使用 Python 构建推荐引擎?
  2. 破除Odoo 菜单栏提示 99+
  3. PHP 表单的提交完美示例
  4. SPI和RAM IP核
  5. Suricata的初始化脚本
  6. 国外常用的jQuery响应式网页模板
  7. 重做LVM文件系统之减小PV
  8. 数据库设计_SQL数据库设计(数据建模)
  9. java程序设计 论文_《JAVA程序设计》论文要求
  10. Java算法面试题(008) 字符串反转
  11. 全国机器人足球锦标赛
  12. python制作折线图_python 生成折线图
  13. 调制解调器 已删除 不可使用的设备
  14. 安徽省软考报名时间成绩查询安徽省教育考试院安徽省人事考试网报名入口
  15. FaE:基于符号知识的适应性和可解释的神经记忆
  16. 基于STAR-CCM+的船舶阻力预测
  17. php文本编辑器fck,HTML文本编辑器:FCKeditor 2.6.3下载
  18. 原油期货价格跌到1美元
  19. 关于如何使用内存擦车的
  20. 二次函数 用matlab,这个二次函数如何在MATLAB中拟合出来?

热门文章

  1. python 工程进度计划_从零开始的项目实战(7)——项目进度述职报告
  2. derived(derived什么意思)
  3. 如何开启任务计划程序
  4. 【@Scheduled定时任务】
  5. 服务器上数据库连接超时问题
  6. 【源码】二维平面应力问题中的弹性材料模型仿真
  7. AngularJS进阶(四十)创建模块、服务
  8. 原生js与jQuery显示隐藏div的几种方法
  9. 欢迎使用Windows安装MySQL(安装版)教程,全网最细
  10. 炫酷可视化教程 Cufflinks 来啦!!!