原文链接:

今日头条

Java注解是一个很重要的知识点,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。

掌握好Java注解有利于学习框架底层实现。@mikechen

Java注解定义

Java注解又称Java标注,是在 JDK5 时引入的新特性,注解(也被称为元数据)。

Java注解它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。

Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。

Java注解应用

1.生成文档这是最常见的,也是java 最早提供的注解;

2.在编译时进行格式检查,如@Override放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出;

3.跟踪代码依赖性,实现替代配置文件功能,比较常见的是spring 2.5 开始的基于注解配置,作用就是减少配置;

4.在反射的 Class, Method, Field 等函数中,有许多于 Annotation 相关的接口,可以在反射中解析并使用 Annotation。

Java注解分类

1、Java自带的标准注解

包括@Override、@Deprecated、@SuppressWarnings等,使用这些注解后编译器就会进行检查。

2、元注解

元注解是用于定义注解的注解,包括@Retention、@Target、@Inherited、@Documented、@Repeatable 等。
元注解也是Java自带的标准注解,只不过用于修饰注解,比较特殊。

3、自定义注解

用户可以根据自己的需求定义注解。

Java标准注解

JDK 中内置了以下注解:

1.@Override

如果试图使用 @Override 标记一个实际上并没有覆写父类的方法时,java 编译器会告警。

class Parent {public void test() {}
}class Child extends Parent  {/***  放开下面的注释,编译时会告警*//*@Overridepublic void test() {}
*/
}

2.Deprecated

@Deprecated 用于标明被修饰的类或类成员、类方法已经废弃、过时,不建议使用。
@Deprecated
class TestClass {// do something
}

3.@SuppressWarnings

@SuppressWarnings 用于关闭对类、方法、成员编译时产生的特定警告。

1)抑制单类型的警告

@SuppressWarnings("unchecked")
public void addItems(String item){  @SuppressWarnings("rawtypes")  List items = new ArrayList();  items.add(item);
}

2)抑制多类型的警告

@SuppressWarnings(value={"unchecked", "rawtypes"})
public void addItems(String item){  List items = new ArrayList();  items.add(item);
}

3)抑制所有类型的警告

@SuppressWarnings("all")
public void addItems(String item){  List items = new ArrayList();  items.add(item);
}

@SuppressWarnings 注解的常见参数值的简单说明:

4.@FunctionalInterface

@FunctionalInterface 用于指示被修饰的接口是函数式接口,在 JDK8 引入。

@FunctionalInterfacepublic interface UserService {void getUser(Long userId);// 默认方法,可以用多个默认方法public default void setUser() {}// 静态方法public static void saveUser() {}// 覆盖Object中的equals方法public boolean equals(Object obj);}

函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。

Java元注解

元注解是java API提供的,是用于修饰注解的注解,通常用在注解的定义上:

1.@Retention

@ Retention用来定义该注解在哪一个级别可用,在源代码中(SOURCE)、类文件中(CLASS)或者运行时(RUNTIME)。

@Retention 源码:

@Documented@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {RetentionPolicy value();
}
public enum RetentionPolicy {//此注解类型的信息只会记录在源文件中,编译时将被编译器丢弃,也就是说//不会保存在编译好的类信息中SOURCE,//编译器将注解记录在类文件中,但不会加载到JVM中。如果一个注解声明没指定范围,则系统//默认值就是ClassCLASS,//注解信息会保留在源文件、类文件中,在执行的时也加载到Java的JVM中,因此可以反射性的读取。RUNTIME
}

RetentionPolicy 是一个枚举类型,它定义了被 @Retention 修饰的注解所支持的保留级别:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE) //注解信息只能在源文件中出现
public @interface Override {
}
@Documented@Retention(RetentionPolicy.RUNTIME)  //注解信息在执行时出现@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)  //注解信息在源文件中出现
public @interface SuppressWarnings {String[] value();
}

2.@Documented

@Documented:生成文档信息的时候保留注解,对类作辅助说明

@Documented 示例

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Column {public String name() default "fieldName";public String setFuncName() default "setField";public String getFuncName() default "getField";public boolean defaultDBValue() default false;
}

3.@Target

@Target:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)

@Target源码:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {ElementType[] value();
}

ElementType 是一个枚举类型,它定义了被 @Target 修饰的注解可以应用的范围:

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

表示自动继承注解类型。 如果注解类型声明中存在 @Inherited 元注解,则注解所修饰类的所有子类都将会继承此注解。

@Inherited
public @interface Greeting {public enum FontColor{ BULE,RED,GREEN};String name();FontColor fontColor() default FontColor.GREEN;
}

5.@Repeatable

@Repeatable 表示注解可以重复使用。

当我们需要重复使用某个注解时,希望利用相同的注解来表现所有的形式时,我们可以借助@Repeatable注解。
以 Spring @Scheduled 为例:

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Schedules {Scheduled[] value();
}@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
public @interface Scheduled {// ...
}

Java基本注解详解(超级详细)相关推荐

  1. java springmvc注解详解_springMVC注解开发详解(转)

    1.@Controller 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ...

  2. @Autowired注解详解——超详细易懂

    @Autowired详解 要搞明白@Autowired注解就是要了解它是什么?有什么作用?怎么用?为什么? 首先了解一下IOC操作Bean管理,bean管理是指(1)spring创建对象 (2)spr ...

  3. java自定义注解详解

    一: 注解的概念 1.1 注解的官方定义 首先看看官方对注解的描述: An annotation is a form of metadata, that can be added to Java so ...

  4. java中注解 详解

    本文将向你介绍J2SE5.0中的新特性之一:注解.本文将从什么是注解:J2SE5.0中预定义的注解:如何自定义注解:如何对注解进行注解以及如何在程序中读取注解5个方面进行讨论. 一.什么是注解 说起注 ...

  5. java(21) - 注解详解

    一.java注解(Annotation): jdk5.0中添加了新的特性注解,与接口很类似,但注解也是java的一种类型,注解的作用非常多例如进行编译检查.生成说明文档.代码分析等. jdk提供的常用 ...

  6. Spring AOP全面详解(超级详细)

    如果说IOC 是 Spring 的核心,那么面向切面编程AOP就是 Spring 另外一个最为重要的核心@mikechen AOP的定义 AOP (Aspect Orient Programming) ...

  7. Redis五种数据类型应用场景详解(超级详细版)

    目录 NoSQL:一类新出现的数据库(not only sql) 特征 NoSQL和SQL数据库的比较: 电商场景解决方案 Redis简介 Redis特性 Redis 优势 Redis应用场景 官方文 ...

  8. Java虚拟机结构详解,详细分析其构成

    Java虚拟机 java虚拟机(java virtual machine,JVM),一种能够运行java字节码的虚拟机.作为一种编程语言的虚拟机,实际上不只是专用于Java语言,只要生成的编译文件匹配 ...

  9. 树上分治详解 超级详细(附带例题 poj1741(给了题目))

    例题大概意思就是有一颗有 n 个顶点的树,其中连接顶点 a_i 和 b_i 的边 i 的长度为 l ,然后统计最短距离不超过 k 的顶点的对数 (虽然篇幅比较长,但是看完会有收获的) 树上的分治,与其 ...

最新文章

  1. (八)pdf的构成之文件体(page属性)
  2. 日期Date和字符串之间转换
  3. Lesson2 Hello,GLSL
  4. Python魔法函数
  5. led控制器java_TM1668 Led 驱动芯片源程序
  6. python分布式框架_高性能分布式执行框架——Ray
  7. 全球边缘计算大会:阿里云资深技术专家李克畅谈边缘计算的技术趋势与挑战
  8. 报表被老板吐槽又多又丑?因为你没有掌握这些动态报表的技巧
  9. linux监控采集项
  10. 模块化思想——粤嵌GEC6818读取图片宽度、高度、色深
  11. java web网上书城_javaweb网上书城项目
  12. QPointer、QScopedPointer、QSharedDataPointer等指针用法总结
  13. 法国电子与计算机信息工程学校排名,法国工程学院的十大排名情况
  14. win10 请求操作需要提升解决方案
  15. c语言三角形的周长和面积公式,计算三角形的周长和面积
  16. 高智商与低智商的区别_体内平衡与智力的定义
  17. 基于STM32L432KC,通过RT-Thread Studio打造一个迷你时钟
  18. Oracle中joint,Nape中的LineJoint-线段关节
  19. maven 编译忽略某些文件
  20. Qt 5入门指南之Qt Quick编程示例

热门文章

  1. python百度地图api经纬度_Python调用百度地图和高德地图API批量获取国内城市地址经纬度坐标...
  2. cuDNN的下载安装
  3. 一个普通人没有学历,自学编程,找到一份月入过万的程序员工作真的有可能吗?
  4. 卷积识别中餐(食物列表)
  5. springboot集成elasticsearch7实现全文检索及分页
  6. java采集_Java实现一个小说采集程序的简单实例
  7. Impalasql日期常用函数
  8. aix 服务器型号,AIX 查看所有硬件设备的PN和SN:
  9. 使用OpenGL渲染一个三角形
  10. 一篇读懂什么是MVVM?MVVM优缺点?