Java核心知识体系2:注解机制详解

本文详细介绍了Java注解的基础知识,包括注解的作用、分类及其使用范围。通过内置注解@Override、@Deprecated和@SuppressWarnings的讲解,深入理解注解的编译期和运行时行为。此外,还探讨了元注解如@Retention和@Target的用法,以及自定义注解的创建。最后,通过实例展示了注解在AOP动态数据源切换中的应用,阐述了注解在解耦合中的重要作用。
摘要由CSDN通过智能技术生成

前言

1 Java注解基础
注解是JDK1.5版本开始引入的一个特性,用于对程序代码的说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。
它主要的作用有以下四方面:

  • 生成javadoc文档,通过在代码里面标识元数据生成javadoc文档。
  • 编译期的检查,通过标识的元数据让编译器在编译期间对代码进行验证。
  • 编译时动态处理,编译时通过代码中标识的元数据动态处理,比如动态生成代码。
  • 运行时动态处理,运行时通过代码中标识的元数据动态处理,比如使用反射技术注入实例。

注解的常见分类有三种:

  • Java自带的标准注解 ,包括 @Override、@Deprecated和@SuppressWarnings,分别代表 方法重写、某个类或方法过时、以及忽略警告,用这些注解标明后编译器就会进行检查。
  • 元注解 ,元注解是用于定义注解的注解,包括@Retention、@Target、@Inherited、@Documented 等6种
    • @Retention:指定其所修饰的注解的保留策略
    • @Document:该注解是一个标记注解,用于指示一个注解将被文档化
    • @Target:用来限制注解的使用范围
    • @Inherited:该注解使父类的注解能被其子类继承
    • @Repeatable:该注解是Java8新增的注解,用于开发重复注解
    • 类型注解(Type Annotation):该注解是Java8新增的注解,可以用在任何用到类型的地方

  • 自定义注解 ,可以根据自己的需求定义注解,并可用元注解对自定义注解进行注解。

接下来我们通过这三种分类来逐一理解注解。
1.1 Java内置注解
我们先从Java内置注解开始说起,先看下下面的代码:
class Parent { public void rewriteMethod() { } } class Child extends Parent { /** * 重载父类的 rewriteMethod() 方法 */ @Override public void rewriteMethod() { } /** * 被弃用的过时方法 */ @Deprecated public void oldMethod() { } /** * 忽略告警 * * @return */ @SuppressWarnings("keep run") public List infoList() { List list = new ArrayList(); return list; } }
Java 1.5开始自带的标准注解,包括@Override、@Deprecated和@SuppressWarnings:

  • @Override :表示当前类中的方法定义将覆盖父类中的方法
  • @Deprecated :表示该代码段被弃用,但是可以使用,只是编译器会发出警告而已
  • @SuppressWarnings :表示关闭编译器的警告信息
    我们再具体看下这几个内置注解,同时通过这几个内置注解中的元注解的定义来引出元注解。

1.1.1 内置注解 - @Override
我们先来看一下这个注解类型的定义:
@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { }
从它的定义我们可以看到,这个注解可以被用来修饰方法,并且它只在编译时有效,在编译后的class文件中便不再存在。这个注解的作用我们大家都不陌生,那就是告诉编译器被修饰的方法是重写的父类的中的相同签名的方法,编译器会对此做出检查,
若发现父类中不存在这个方法或是存在的方法签名不同,则会报错。
1.1.2 内置注解 - @Deprecated
这个注解的定义如下:
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE}) public @interface Deprecated { }
从它的定义我们可以知道,它会被文档化,能够保留到运行时,能够修饰构造方法、属性、局部变量、方法、包、参数、类型。这个注解的作用是告诉编译器被修饰的程序元素已被“废弃”,不再建议用户使用。
1.1.3 内置注解 - @SuppressWarnings
这个注解我们也比较常用到,先来看下它的定义:
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) @Retention(RetentionPolicy.SOURCE) public @interface SuppressWarnings { String[] value(); }
它能够修饰的程序元素包括类型、属性、方法、参数、构造器、局部变量,只能存活在源码时,取值为String[]。它的作用是告诉编译器忽略指定的警告信息,它可以取的值如下所示:

参数 作用 原描述
all 抑制所有警告 to suppress all warnings
boxing 抑制装箱、拆箱操作时候的警告 to suppress warnings relative to boxing/unboxing operations
cast 抑制映射相关的警告 to suppress warnings relative to cast operations
dep-ann 抑制启用注释的警告 to suppress warnings relative to deprecated annotation
deprecation 抑制过期方法警告 to suppress warnings relative to deprecation
fallthrough 抑制确在switch中缺失breaks的警告 to suppress warnings relative to missing breaks in switch statements
finally 抑制finally模块没有返回的警告 to suppress warnings relative to finally block that don’t return
hiding 抑制与隐藏变数的区域变数相关的警告 to suppress warnings relative to locals that hide variable()
incomplete-switch 忽略没有完整的switch语句 to suppress warnings relative to missing entries in a switch statement (enum case)
nls 忽略非nls格式的字符 to suppress warnings relative to non-nls st
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值