【Java】注解的使用

1.注解是什么

这个注解表示该方法是重写的
image

  • jdk 5.0 新增的功能。
  • 注解:Annotation,代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取,通过使用注解,可以在源文件中嵌入一些补充信息。
  • 框架 = 注解 + 反射机制 + 设计模式。
  • JavaSE中注解一般用来标记过时的功能,忽略警告等;JavaEE/Android中注解可以用来配置应用程序的切面,代替JavaEE旧版中所遗留的繁冗代码和XML配置等。

2.注解的使用

  • 生成doc文档
  • 编译时格式检查(jdk内置的)
    • @Override:重写父类方法。
    • @Deprecated:所修饰的元素(类、方法等)已过时。
    • @SuppressWarnings(""):抑制编译警告(null警告、拆箱装箱警告等)
  • 跟踪代码依赖性,实现替代配置文件(@Controller、@Resource)
@SuppressWarnings("all")
public class AnnoTest01 {

    @Override
    public String toString() {
        return "AnnoTest01{}";
    }

    @Deprecated
    public void displayTV(){
        //过时了,不推荐使用,但可以使用
    }

    public void displayAll(){
        //更好的方法
    }
}

3.元注解

对现有的注解进行解释说明的注解
image

jdk提供的4种元注解

  • @Retention:指定修饰注解的生命周期,该注解被保留到哪个阶段。
    • SOURCE:代码阶段有效
    • CLASS:会被保留到字节码阶段
    • RUNTIME:会被保留到运行阶段
  • @Target:指定修饰注解能用于修饰哪些程序元素(方法、属性、构造器...)。
  • @Documented:指定修饰的注解在被javadoc解析时保留下来。
  • @Inherited:指定修饰的注解具有继承性。

4.自定义注解

  • 使用@interface修饰。
  • 内部定义成员,通常使用value表示,可以指定默认值。
  • 没有成员则表示一个标识作用。
  • 通常都会指明两个元注解@Retention、@Target

自定义注解名字叫Hello

@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
public @interface Hello {
    String userName();
    int age() default 10;

}

使用

@Hello(userName = "张三",age = 50)
public class Person {

}

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

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

6.jdk 8中注解的新特性

  • 可重复注解:@Repeatable
  • 类型注解:@Target中新增类型
    • ElementType.TYPE_PARAMETER:表示该注解能卸载类型变量的声明语句中(如泛型声明)。
    • ElementType.TYPE_USE:表示该注解能写在使用类型的任何语句中。

想重复使用@Hello注解,自定义两个注解

@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Repeatable(World.class)
public @interface Hello {
    String userName();
    int age() default 10;

}

@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
public @interface World {
    Hello[] value();
}

使用

public class Person {

    @Hello(userName = "张三",age = 18)
    @Hello(userName = "李四",age = 20)
    public void who(){
        
    }
}

参考链接
1.注解@Repeatable详解

posted @ 2022-11-24 11:01  植树chen  阅读(111)  评论(0编辑  收藏  举报