JavaSE学习总结(二十三)注解/@Override、@Deprecated和@SuppressWarnings/自定义注解/元注解/可重复注解@Repeatable/类型注解

本文详细介绍了JavaSE中的注解,包括注解概述、常见的JDK内置注解如@Override、@Deprecated、@SuppressWarnings的用法,自定义注解的创建和使用,以及JDK中的元注解如@Retention、@Target、@Documented和@Inherited。此外,还探讨了JDK1.8中新增的可重复注解@Repeatable和类型注解的使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、注解概述

  • 从 JDK 5.0 开始,Java 增加了对元数据(MetaData) 的支持,也就是Annotation(注解)
  • Annotation 其实就是代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理。通过使用 Annotation,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证或者进行部署。
  • Annotation 可以像修饰符一样被使用,可用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明,这些信息被保存在 Annotation 的 “name=value” 对中
  • 在JavaSE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在JavaEE/Android中注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替JavaEE旧版中所遗留的繁冗代码和XML配置等。
  • 开发模式都是基于注解的,注解是一种趋势,一定程度上可以说:框架 = 注解 + 反射 + 设计模式。

另外,Junit单元测试中也有大量注解的使用。简单罗列到下面:

  • @Test:标记在非静态的测试方法上,只有标记@Test的方法才能被作为一个测试方法单独测试,一个类中可以有多个@Test标记的方法。运行时如果只想运行其中一个@Test标记的方法,那么选择这个方法名,然后单独运行, 否则整个类的所有标记了@Test的方法都会被执行。
    • @Test(timeout=1000):设置超时时间,如果测试时间超过了你定义的timeout,测试失败
    • @Test(expected):申明会发生的异常,比如@Test(expected=Exception.class)

了解:

  • @BeforeClass:标记在静态方法上,因为这个方法只执行一次。在类初始化时执行。
  • @AfterClass:标记在静态方法上,因为这个方法只执行一次。在所有方法完成后执行。
  • @Before:标记在非静态方法上。在@Test方法前面执行,而且是在每一个@Test方法前面都执行。
  • @After:标记在非静态方法上。在@Test方法后面执行,而且是在每一个@Test方法后面都执行。
  • @Ignore:标记在本次不参与测试的方法上,这个注解的含义就是“某些方法尚未完成,暂不参与此次测试”。
  • @BeforeClass、@AfterClass、@Before、@After、@Ignore都是配合@Test它使用的,单独使用没有意义。

二、常见的注解

使用 Annotation 时要在其前面增加 @ 符号, 并把该 Annotation 当成一个修饰符使用。用于修饰它支持的程序元素

(一)JDK内置的三个基本注解

在编译时进行格式检查

1.@Override

限定重写父类方法, 该注解只能用于方法

2.@Deprecated

用于表示所修饰的元素(类, 方法等)已过时。通常是因为所修饰的结构危险或存在更好的选择

3.@SuppressWarnings

作用:告诉编译器忽略指定的警告,不用在编译完成后出现警告信息。(抑制编译器警告)

使用:
@SuppressWarnings("")
@SuppressWarnings({})
@SuppressWarnings(value={})
@SuppressWarnings(value={"具体的警告","具体的警告"...})
在这里插入图片描述
我们可以看到SuppressWarnings注解中有一个value(),它是成员变量,以无参数方法的形式来声明。其方法名和返回值定义了该成员的名字和类型。

示例:

  • @SuppressWarnings("all")
    抑制所有警告信息

  • @SuppressWarnings(“unchecked”)
    告诉编译器忽略 unchecked 警告信息,如使用List,ArrayList等未进行参数化产生的
    警告信息。

  • @SuppressWarnings(“deprecation”)
    如果使用了使用@Deprecated注释的方法,编译器将出现警告信息。使用这个注释将警告信息去掉。

  • @SuppressWarnings(“unchecked”, “deprecation”)
    告诉编译器同时忽略unchecked和deprecation的警告信息。

  • @SuppressWarnings(value={“unchecked”, “deprecation”})
    等同于@SuppressWarnings(“unchecked”, “deprecation”)

案例演示

public class AnnotationTest{
   
    public static void main(String[] args) {
   
        @SuppressWarnings("unused")//告诉编译期,忽略“unused”警告信息
        int a = 10;//未使用的变量
    }
    
    @Deprecated
    public void print(){
   
        System.out.println("过时的方法");
    }
    
    @Override
    public String toString() {
   
        return "重写的toString方法()"; }
}

三、自定义注解

  • 定义新的 Annotation 类型要使用 @interface 关键字
  • 自定义注解自动继承了java.lang.annotation.Annotation接口
  • Annotation 的成员变量在 Annotation 定义中以无参数方法的形式来声明。其方法名和返回值定义了该成员的名字和类型。我们称为配置参数。类型只能是八种基本数据类型、String类型、Class类型、enum类型、Annotation类型、以上所有类型的数组
  • 可以在定义 Annotation 的成员变量时为其指定初始值,指定成员变量的初始值可使用 default 关键字
  • 如果只有一个参数成员,建议使用参数名为value
  • 如果定义的注解含有配置参数,那么使用时必须指定参数值,除非它有默认值。格式是“参数名 = 参数值”,如果只有一个参数成员,且名称为value,可以省略“value=”
  • 没有成员定义的 Annotation 称为标记;包含成员变量的 Annotation 称为元数据 Annotation

注意:自定义注解必须配上注解的信息处理流程(使用到反射)才有意义。

案例演示
自定义注解

public @interface MyAnnotation {
   
    String[] value() default "hi";
}

测试类

pu
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值