从零学Java - 注解

发布时间:2024年01月24日

Java - 注解

1 什么是注解?

注解(Annotation):属于引用数据类型,是代码里的特殊标记, 程序可以读取注解,一般用于替代配置文件。

2 注意事项

  • 使用@interface关键字定义。
  • 注解中只能包含公开的属性,使用default关键字赋值默认值。
  • 如果属性名是value,赋值时可以省略属性名。

开发人员可以通过注解告诉类如何运行。

  • 注解的典型应用是:可以通过反射技术去得到类里面的注解,以决定怎么去运行类。

代码演示:

MyAnnotation:

public @interface MyAnnotation {
    //属性
    String name() default "张三";
    int age() default 19;
    Gender gender() default Gender.MALE;
}

Person:

public class Person {
    //有默认值时可以省略, 也可以覆盖
    //当属性名为 value 时, 赋值可省略属性名
    @MyAnnotation(name = "李四", age = 10, gender = Gender.FEMALE)
    public void show() throws NoSuchMethodException {
        //读取注解, 使用反射读取注解
        //1 获取类对象
        Class<?> personClass = Person.class;
        //2 获取show方法
        Method show = personClass.getMethod("show");
        //3 获取注解
        MyAnnotation annotation = show.getAnnotation(MyAnnotation .class);
        System.out.println(
            annotation.name()+"..."+annotation.age()+"..."+annotation.gender()
        );
    }
}

Test:

public class Test {
    public static void main(String[] args) throws Exception{
        Person person = new Person();
        person.show();
    }
}

报错:

  • Exception in thread “main” java.lang.NullPointerException

    • at StageOne.day25.demo1.TestAnnotation.Person.show(Person.java:25)

    • at StageOne.day25.demo1.TestAnnotation.Test.main(Test.java:12)

Person:

  • Annotation ‘MyAnnotation .class’ is not retained for reflective access
  • 注释’MyAnnoation. class’不保留用于反射访问

解决方法:

  • 添加元注解, 指定注解可以保留的域

MyAnnotation:

@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    //属性
    String name() default "张三";
    int age() default 19;
    Gender gender() default Gender.MALE;
}

3 元注解

元注解:用来描述注解的注解。

3.1 常有元注解

@Retention:用于指定注解可以保留的域。

  • RetentionPolicy.CLASS:(只在字节码层面)
    • 注解记录在class文件中,运行Java程序时, JVM不会保留,此为默认值。
  • RetentionPolicy.RUNTIME:(不仅再字节码层面, 运行时也保留)
    • 注解记录在 class文件中,运行Java程序时,JVM会保留,程序可以通过反射获取该注释。
  • RetentionPolicy.SOURCE:

@Target:指定注解用于修饰类的哪个成员。

代码演示:

@Target(ElementType.METHOD)//只能用于方法上
@Retention(RetentionPolicy.SOURCE)//编译时直接丢弃这种策略的注释
public @interface Override {
}

4 注解的属性

注解属性类型:

  • String类型
  • 基本数据类型
  • Class类型
  • 枚举类型
  • 注解类型
  • 以及以上类型的一维数组

5 注解的本质

注解的本质: 接口;

  • 属性其实就是抽象方法。

代码反编译:

import StageOne.day25.demo1.TestEnum.Gender;
import java.lang.annotation.Annotation;

public interface MyAnnotation
	extends Annotation
{

	public abstract String name();

	public abstract int age();

	public abstract Gender gender();
}
文章来源:https://blog.csdn.net/weixin_50858647/article/details/135756763
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。