Java注解

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


提示:以下是本篇文章正文内容,下面案例可供参考

一、在编译时进行格式检查(JDK内置的三个基本注解)

二、使用步骤

1.理解Annotation

① jdk 5.0 新增的功能

② Annotation,其实就是代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相关操作,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。

2.Annocation的使用示例

示例一: 生成文档相关的注解

示例二: 在编译时进行格式检查(JDK内置的三个基本注解)

@Override: 限定重写父类方法,该注解只能用于方法@Deprecated: 用于表示所修饰的元素(类,方法等)已过时。@SuppressWarnings: 抑制编译器警告

示例三: 跟踪代码依赖性,实现替代配置文件功能

3.如何自定义注解

参照@SuppressWarning定义

① 注解声明为: @interface

②内部定义成员,通常使用value表示

③可以指定成员的默认值,使用default 定义

④如果自定义注解没有成员,表明是一个标识作用

如果注解有成员,在使用注解时,需要指明成员的值。

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

自定义注解通过都会指明两个元注解: Retention、Target

4.jdk 提供的4种元注解

元注解:对现有的注解进行解释说明的注解

Retention: 指定所修饰的 Annotation 的生命周期: SOURCE\CLASS (默认行为)\RUNTIME

只有声明为RUNTIME生命周期的注解,才能通过反射获得。

Target: 用于指定被修饰的 Annotation 能用于修饰哪些程序元素

Documented:表示所修施的注解在被iavadoc 解析时,保留下来

Inherited:被它修饰的 Annotation 将具有继承性

5.通过反射获得注解信息

6.jdk 8 中注解的新特性: 可重复注解、类型注解

6.1 可重复注解

1.在MyAnnotation上声明@Repeatable,成员值为MyAnnotations.class

2.MyAnnotation的Target和Retentiond等元注解与MyAnnotations相同.

6.2 类型注解

ElementType.TYPE_PARAMETER 表示该注解能写在类型变量的声明语句中(如:泛型声明)

ELementType.TYPE_USE 表示该注解能写在使用类型的任何语句中。

7.元注解

元注解:对现有的注解进行解释说明的注解。

三、代码案例

1.自定义注解

cpp 复制代码
package com.tyust.edu;

import java.lang.annotation.*;

import static java.lang.annotation.ElementType.*;

/**
 * 自定义注解
 * @author YML TYUST-XDU 2019-2026
 * @create 2023-10-09 10:22
 */
@Inherited
@Repeatable(MyAnnotations.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE,TYPE_PARAMETER,TYPE_USE})
public @interface MyAnnotation {
//    String[] value();
    String[] value() default "hello";
}
cpp 复制代码
package com.tyust.edu;

import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.ElementType.LOCAL_VARIABLE;

/**
 * @author YML TYUST-XDU 2019-2026
 * @create 2023-10-09 10:57
 */
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE})
public @interface MyAnnotations {
    MyAnnotation[] value();
}

2.JDK内置的三个基本注解

cpp 复制代码
package com.tyust.edu;

import org.junit.Test;

import java.lang.annotation.Annotation;
import java.util.ArrayList;
import java.util.Date;

/**
 * JDK内置的三个基本注解
 * @author YML TYUST-XDU 2019-2026
 * @create 2023-10-09 10:08
 */
public class AnnotationTest {
    public static void main(String[] args) {
        Person p = new Student();
        p.walk();


//        @Deprecated
//@Contract(pure = true)
//public Date(     int year,
//        @MagicConstant(intValues = {Calendar.JANUARY,Calendar.FEBRUARY,Calendar.MARCH,Calendar.APRIL,Calendar.MAY,Calendar.JUNE,Calendar.JULY,Calendar.AUGUST,Calendar.SEPTEMBER,Calendar.OCTOBER,Calendar.NOVEMBER,Calendar.DECEMBER})  int month,
//        int date )

        Date date = new Date(2023,20,9);
        System.out.println(date);

        @SuppressWarnings("unused")
        int num = 10;



    }


    //通过反射获取注解信息
    @Test
    public void testGetAnnotation(){
        Class clazz = Student.class;
        Annotation[] annotations = clazz.getAnnotations();
        for (int i = 0; i <annotations.length; i++) {
            System.out.println(annotations[i]);
        }
    }

}

//@MyAnnotation(value = "hello")
//jdk8之前的写法
//@MyAnnotations({@MyAnnotation(value = "hello"),@MyAnnotation(value = "hi")})
@MyAnnotation(value = "hello")
@MyAnnotation(value = "hi")
class  Person{

    String name;
    int age;

    public Person(){

    }

    public Person(String name,int age){
        this.name = name;
        this.age = age;
    }
    public void walk(){
        System.out.println("人走路");
    }
    public void eat(){
        System.out.println("人吃饭");
    }

}

interface Info1{
    void show();
}


class Student extends Person implements Info1{

    @Override
    public void walk() {
        System.out.println("学生走路");
    }

    @Override
    public void show() {

    }
}

class Generic<@MyAnnotation T>{
    public void show()throws @MyAnnotation RuntimeException{
        ArrayList<@MyAnnotation String> list = new ArrayList<>();

        int num = (@MyAnnotation int)10L;

    }

}
相关推荐
kinlon.liu3 分钟前
零信任安全架构--持续验证
java·安全·安全架构·mfa·持续验证
鸽芷咕19 分钟前
【Python报错已解决】ModuleNotFoundError: No module named ‘paddle‘
开发语言·python·机器学习·bug·paddle
王哲晓24 分钟前
Linux通过yum安装Docker
java·linux·docker
Jhxbdks28 分钟前
C语言中的一些小知识(二)
c语言·开发语言·笔记
java66666888828 分钟前
如何在Java中实现高效的对象映射:Dozer与MapStruct的比较与优化
java·开发语言
Violet永存29 分钟前
源码分析:LinkedList
java·开发语言
执键行天涯30 分钟前
【经验帖】JAVA中同方法,两次调用Mybatis,一次更新,一次查询,同一事务,第一次修改对第二次的可见性如何
java·数据库·mybatis
代码雕刻家31 分钟前
数据结构-3.1.栈的基本概念
c语言·开发语言·数据结构
Fan_web32 分钟前
JavaScript高级——闭包应用-自定义js模块
开发语言·前端·javascript·css·html
梦想科研社38 分钟前
【无人机设计与控制】四旋翼无人机俯仰姿态保持模糊PID控制(带说明报告)
开发语言·算法·数学建模·matlab·无人机