java的注解


推荐导航

0.系统学习导航传送


一.概述

  1. 注解的本质: 注解就是接口 (1.5之后的新特性)
  2. 注解是一种元数据形式。即注解是属于java的一种数据类型,和类、接口、数组、枚举类似。
  3. 注解用来修饰,类、方法、变量、参数、包。
  4. 注解不会对所修饰的代码产生直接的影响。
  5. 使用注解,实质上创建了一个注解的对象实例;

二.注解介绍

1.注解分类

文档注解(注释), 编译时注解, 运行时注解
1.编写文档: 通过注释中的注解用javadoc命令生成文档
2.编译检查: 例如@Override注解
3.代码分析: 对代码进行分析(自定义注解)

2.jdk中的注解

@Override: 检查标注方法是否是继承父类的方法
@Deprecated: 标注的内容已过时
@SuppressWarnings: 压制警告

3.元注解

@Target: 描述注解能够作用的位置
@Retention: 描述注解被保留的阶段
@Dcoumented: 描述注解是否被抽取到api文件中
@Inherited: 描述注解是否被子类继承

  • @Target

ElementType属性
1.TYPE 类上
2.METHOD: 方法
3.FIELD: 成员变量

  • @Retention

RetentionPolicy
1.SOURCE 文档类注解
2.CLASS 编译检查类注解
3.RUNTIME 运行时注解

三种类型的区别

类型介绍
RetentionPolicy.SOURCE只在本编译单元的编译过程中保留,并不写入Class文件中。这种注解主要用于在本编译单元(这里一个Java源码文件可以看作一个编译单元)内触发注解处理器(annotation processor)的相关处理,例如说可以让注解处理器相应地生成一些代码,或者是让注解处理器做一些额外的类型检查,等等。
RetentionPolicy.CLASS在编译的过程中保留并且会写入Class文件中,但是JVM在加载类的时候不需要将其加载为运行时可见的(反射可见)的注解。这里很重要的一点是编译多个Java文件时的情况:假如要编译A.java源码文件和B.class文件,其中A类依赖B类,并且B类上有些注解希望让A.java编译时能看到,那么B.class里就必须要持有这些注解信息才行。
RetentionPolicy.RUNTIME在编译过程中保留,会写入Class文件,并且JVM加载类的时候也会将其加载为反射可见的注解。这就不用多说了,例如说Spring的依赖注入就会在运行时通过扫描类上的注解来决定注入啥。
  • @Dcoumented

文档生成相关,忽略

  • @Inherited

1.@TT注解上标注了@Inherited注解
类A上标注了@TT注解,类B继承类A,那么类B也同时继承了@TT注解 (因为标注了@Inherited,可被继承)

4.定义语义(枚举创建)

  1. 属性返回值
    • 基本数据类型
    • String
    • 枚举
    • 注解
    • 上面类型的数组
  2. 属性赋值,使用时必须赋值
    • 定义时,使用default 默认初始化,使用时可以不用赋值
    • 如果只有一个属性需要赋值,并且属性名是value,则该值在赋值时可以省略key的值 (例如: @CherryAnnotation(11))
  • 案例
//案例
    public @interface CherryAnnotation {
	public String name();
	int age() default 18;
	int[] array();
        int value();
    }

//案例2
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Anno {
        int age() default 0;
        String name() default "zhang";
        String[] value() ;
    }
    
    
    @Anno(value={"11","22"}, age=1)
    public class AnnoTest {
        public static void main(String[] args) {
            //本质: 注解是通过反射实现了注解(本质是接口),并将属性带入
            //获取class对象
            Class<AnnoTest> class1 = AnnoTest.class;
            //根据class对象,获取对象实例
            Anno annotation = class1.getAnnotation(Anno.class);
            //输出实例属性
            System.out.println(annotation.age());
            System.out.println(annotation.value());
    
        }
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值