注解 (有图有例解释)

本文深入讲解Java注解的概念、用途及实现方式。介绍标准注解如@Override、@Deprecated,并演示自定义注解的创建与应用。同时探讨注解反射机制及其在实际开发中的意义。

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

注解不是注释,注释是程序员写的,给程序员看的。注解给程序看,用于描述程序如何运行及在什么阶段来运行。
现在在实际开发中,注解最大的功能是用于替换配置文件


注解是jdk1.5的新特性。
可以通过反射来让注解具有功能
注解格式: @Xxxx

2.1 JDK中的三个基本的注解:

    a. @Override   检查子类确实是覆盖了父类的方法。
    b. @Deprecated   说明已经过时了。
    c. @SuppressWarnings({ "unused", "deprecation", "rawtypes" })   抑制程序中的警告。unused(变量未使用)deprecation(过时)rawtypes(泛型)表示警告的类型。{}数组。
    d. @SuppressWarnings("all")  all抑制所有警告。

    示例代码如下:

package com.itheima.demo1;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class Demo1 {
// @SuppressWarnings({ "unused", "deprecation", "rawtypes" })
@SuppressWarnings("all")
public void ff() {
int i = 0;
System.out.println("abc");
List list = new ArrayList();
System.out.println(new Date().toLocaleString());
}
public void HaHa() {
}
}
class Demo2 extends Demo1 {
@Override
public void ff() {
}
@Deprecated
public void HaHaHa() {
System.out.println(new Date().toLocaleString());
}
}

2.2 自定义注解的语法(注解的肉体

    研究一下注解的本质:
        声明一个注解(或者创建一个注解类): @interface 注解名{…}

public @interface MyAnnotation {}

    通过反编译可知,注解它的本质就是一个接口,这个接口需要继承 Annotation接口。但是不能按照下述的代码格式写,需要按照上述代码格式写。

public interface MyAnnotation extends java.lang.annotation.Annotation {...}

    分析注解类中的成员:
        注解本质上就是接口,我们知道接口中可以有属性和方法。
            属性:public static final int age;
            方法:public abstract void show();

        但是在注解中也可以有属性,也可以有方法。但是,注解中一般不使用属性。
        在注解的开发中,我们只写方法。
        我们管注解中的方法,叫做注解的属性。
        在注解中我们管方法的返回值叫做注解的类型。
            注解定义属性的格式 : 例如:int age();

    关于注解的属性类型可以有哪些?
        1. 基本类型
        2. String
        3. 枚举类型
        4. 注解类型
        5. Class类型
        6. 以上类型的一维数组类型

    注解:就是在你的程序代码中的某个位置加了一个标记而已。

   示例代码如下图所示:

2.3 注解的反射(注解的灵魂)

    模拟 Junit 的 @Test 方法

   a、反射注解类
   java.lang.reflect.AnnotatedElement;
      < T extends Annotation > T getAnnotation(Class< T > annotationType)   得到指定类型的注解引用。没有,返回null。
      Annotation[] getAnnotations()   得到所有的注解,包含从父类继承下来的。
      Annotation[] getDeclaredAnnotations()   得到自己身上的注解。
      boolean isAnnotationPresent(Class< ? extends Annotation > annotationType)   判断指定的注解有没有。

    ClassMethodFieldConstructor等实现了AnnotatedElement接口
    例如:
      Class.isAnnotationPresent(MyTest.class);     判断类上面有没有@MyTest注解。
      Method.isAnnotationPresent(MyTest.class);     判断方法上面有没有@MyTest注解。

    b、反射注解中的属性
    如下图元注解图片中所示:

2.4 元注解

    a、自定义注解的存活范围(生命周期):默认是CLASS。


    什么是元注解? 答:只能用在注解类上的注解叫做元注解。(即:用于修饰注解的注解

 

  • @Retention 作用:改变自定义注解的存活范围。
      RetentionPolicy
        SOURCE
        CLASS
        RUNTIME
      例如:@Retention(RetentionPolicy.RUNTIME)

  • @Target 作用:指定该注解能用在什么地方。
      ElementType
        TYPE
        METHOD
        FIELD
        ANNOTATION_TYPE
      例如:@Target({ ElementType.METHOD, ElementType.TYPE })

  • @Documented 作用:使用了@MyTest的注解的类,如果@MyTest注解类上面有@Documented注解,那么使用了@MyTest的注解的类的API文档中会出现@MyTest的身影。

  • @Inherited 作用:说明使用了该注解的类的子类可以继续使用该注解。

    示例代码如下图所示:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值