java注解

简介: java注解

注解的相关概念

1.认识Annotation

JDK1.5开始,java增加了对元数据(即类的组成单元数据)的支持,也就是(Annotation)注解,它是代码里做的特殊标记,这些标记可以在编译,类加载,运行时在不改变原有逻辑的情况下,被读取,并执行相应的处理,通过使用Annotation,程序员可以在源文件中嵌入一些补充的信息,代码分析工具。开发工具和部署工具可以通过这些补充信息进行验证或者进行部署,Annotation类似于修饰符一样被使用,可以用于包,类,构造器方法,方法,成员变量,参数,局部变量的声明

2.系统自定义的Annotation

在JDK.1.5之后,在系统中提供了三个Annocation,分别是 @Override,@Deprecated,@SuppressWarnings

  • @Override
    表示当前的方法定义将覆盖超类中的方法,如果你不小心拼写错误,或者方法签名对不上被覆盖的方法,编译器就会发出错误提示。
    例如:我们常见的toString方法,如果写错,这里会有提示

  • @Deprecated
    表示的是一个方法已经过时了不再建议使用了,标记为已过时
    例如:

如果进行调用的话:

  • @SuppressWarnings
    表示关闭不当的编译器警告信息
    例如:我们创建一个没有指定类型的list集合

    这里会爆出黄色警告,加上注解后

警告消失。

3.自定义Annocation(注解应用需要三个步骤)

(1)编写注解(这里可以给变量添加默认值)

public @interface MyAnnotation {
    // 定义变量
    String name();
    int age() default 2;// 给变量设置默认值
    String[] eat();
    Color color();
}

(2)在类上应用注解(有默认值的变量可以不用写,其他变量值必须要写)

@MyAnnotation(name = "欢欢", eat = {"猪肉", "牛肉"}, color = Color.GREEN)
class Dog {
    private int age;
    private String name;
    private String[] eat;
    private Color color;
    public String[] getEat() {
        return eat;
    }
    public void setEat(String[] eat) {
        this.eat = eat;
    }
    public Color getColor() {
        return color;
    }
    public void setColor(Color color) {
        this.color = color;
    }
    public Dog(int age, String name) {
        this.age = age;
        this.name = name;
    }
    public Dog() {
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "Dog{" +
                "age=" + age +
                ", name='" + name + '\'' +
                ", eat=" + Arrays.toString(eat) +
                ", color=" + color +
                '}';
    }
    /**
     * 这个注解表明此方法过时
     */
    @Deprecated
    public void getInfo() {
        System.out.println("已经过时的方法");
    }
}

这里用到了一个枚举类:

package com.lili.annotation;
/**
 * @author: QiJingJing
 * @create: 2021/7/16
 */
public enum Color {
    /**
     * 红色,绿色,蓝色
     */
    RED, GREEN, YELLOW;
}

(3)对应用了注解的类进行反射操作的类(通过反射获取对象注解的值并给对象赋值)

@Test
public void test2() {
    Class<Dog> dogClass = Dog.class;
    // 获取类上应用的指定注解
    MyAnnotation annotation = dogClass.getAnnotation(MyAnnotation.class);
    // 获取注解上的变量值
    int age = annotation.age();
    Color color = annotation.color();
    String name = annotation.name();
    String[] eat = annotation.eat();
    try {
        Dog dog = dogClass.newInstance();
        // 进行赋值
        dog.setAge(age);
        dog.setColor(color);
        dog.setName(name);
        dog.setEat(eat);
        System.out.println(dog);
    } catch (InstantiationException | IllegalAccessException e) {
        e.printStackTrace();
    }
}

运行如下:

4.Retention和RetentionPolicy注解

Annotation要想决定其作用的范围,通过@Retention指定,而Retention指定的范围由RetentionPolicy决定,RetentionPolicy三种范围,源码如下:

我们可以看到,@Retention注解的变量是RetentionPolicy类型的,我们不妨点进去查看:

是个枚举类,有三种对象供我们使用,

  • SOURCE :在java源文件中存在
  • CLASS :在java生成的class中存在
  • RUNTIME: 在java运行的时候存在;

5.@Target注解和@Documented注解

@Target注解表示的是一个Annotation的使用范围

范围 描述
TYPE 只能在类上或接口或枚举上使用
FIELD 在成员变量中使用
METHOD 在方法中使用
PARAMETER 在参数上使用
CONSTRUCTOR 在构造中使用
LOCAL_VARIABLE 在局部变量中使用
ANNOTATION_TYPE 在注解上使用
PACKAGE 在包中使用

而@Documented注解表示在注解中使用,表示可生成带注释的文档。

因此,我们可以完善自定义注解如下:

package com.lili.annotation;
import java.lang.annotation.*;
/**
 * 自定义注解
 *
 * @author 齐菁菁
 */
/*表示可生成带注释的文档*/
@Documented
// 表示该注解的作用范围在运行中存在
@Retention(RetentionPolicy.RUNTIME)
// 注解的应用范围(类型,属性,方法,构造器,参数,局部变量,包,注解)
@Target(ElementType.TYPE)
public @interface MyAnnotation {
    // 定义变量
    String name();
    int age() default 2;// 给变量设置默认值
    String[] eat();
    Color color();
}


目录
相关文章
|
29天前
|
XML Java 编译器
Java注解的底层源码剖析与技术认识
Java注解(Annotation)是Java 5引入的一种新特性,它提供了一种在代码中添加元数据(Metadata)的方式。注解本身并不是代码的一部分,它们不会直接影响代码的执行,但可以在编译、类加载和运行时被读取和处理。注解为开发者提供了一种以非侵入性的方式为代码提供额外信息的手段,这些信息可以用于生成文档、编译时检查、运行时处理等。
63 7
|
3月前
|
XML Java 编译器
Java学习十六—掌握注解:让编程更简单
Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。
105 43
Java学习十六—掌握注解:让编程更简单
|
1月前
|
Java 编译器 数据库
Java 中的注解(Annotations):代码中的 “元数据” 魔法
Java注解是代码中的“元数据”标签,不直接参与业务逻辑,但在编译或运行时提供重要信息。本文介绍了注解的基础语法、内置注解的应用场景,以及如何自定义注解和结合AOP技术实现方法执行日志记录,展示了注解在提升代码质量、简化开发流程和增强程序功能方面的强大作用。
82 5
|
2月前
|
Java 开发者 Spring
[Java]自定义注解
本文介绍了Java中的四个元注解(@Target、@Retention、@Documented、@Inherited)及其使用方法,并详细讲解了自定义注解的定义和使用细节。文章还提到了Spring框架中的@AliasFor注解,通过示例帮助读者更好地理解和应用这些注解。文中强调了注解的生命周期、继承性和文档化特性,适合初学者和进阶开发者参考。
67 14
|
2月前
|
Java 编译器
Java进阶之标准注解
Java进阶之标准注解
43 0
|
3月前
|
JSON Java 数据库
java 常用注解大全、注解笔记
关于Java常用注解的大全和笔记,涵盖了实体类、JSON处理、HTTP请求映射等多个方面的注解使用。
53 0
java 常用注解大全、注解笔记
|
4月前
|
Arthas Java 测试技术
Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解
Java字节码文件、组成、详解、分析;常用工具,jclasslib插件、阿里arthas工具;如何定位线上问题;Java注解
Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解
|
3月前
|
IDE Java 编译器
java的反射与注解
java的反射与注解
28 0
|
4月前
|
Java 编译器 程序员
Java注解,元注解,自定义注解的使用
本文讲解了Java中注解的概念和作用,包括基本注解的用法(@Override, @Deprecated, @SuppressWarnings, @SafeVarargs, @FunctionalInterface),Java提供的元注解(@Retention, @Target, @Documented, @Inherited),以及如何自定义注解并通过反射获取注解信息。
Java注解,元注解,自定义注解的使用
|
3月前
|
XML Java 数据格式
Java-spring注解的作用
Java-spring注解的作用
31 0