其他分享
首页 > 其他分享> > 自定义注解

自定义注解

作者:互联网

自定义注解

1. 注解概要描述

注解描述:在 java 源码的类、方法、字段、参数前的特殊“注释”,注解会被编译器直接忽略,注解则可以被编译器打包进入class文件,因此,注解是一种用作标注的“元数据”。

作用:

从JVM的角度看,注解本身对代码逻辑没有任何影响,如何使用注解完全由工具决定。

注解分类:

  1. 编译器使用的注解

这类注解不会被编译进入.class文件,它们在编译后就被编译器扔掉了。

  1. 工具处理 .class 文件使用的注解

比如有些工具会在加载class的时候,对class做动态修改,实现一些特殊的功能。这类注解会被编译进入.class文件,但加载结束后并不会存在于内存中。这类注解只被一些底层库使用,一般我们不必自己处理。

  1. 程序运行期读取的注解

在加载后一直存在于JVM中,这也是最常用的注解。例如,一个配置了@PostConstruct的方法会在调用构造方法后自动被调用(这是Java代码读取该注解实现的功能,JVM并不会识别该注解)。

注解参数类型:

2. 注解实现

2.1 定义注解

/**
 * @author Andrew
 * @date 2022/6/16
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Information {
    String name();

    int age();

    String[] hobbies();

    String address() default "中国";
}

注解的参数类似无参数方法,可以用default设定一个默认值。最常用的参数应当命名value

2.2 元注解

可以修饰其他注解的就叫元注解。

  1. Target

@Target可以定义Annotation能够被应用于源码的哪些位置:

  1. Retention

@Retention定义了Annotation的生命周期

  1. Repetable

@Repeatable这个元注解可以定义Annotation是否可重复

  1. Inherited

@Inherited定义子类是否可继承父类定义的Annotation

2.3 处理注解

Java的注解本身对代码逻辑没有任何影响。根据@Retention的配置:

注解定义后也是一种class,所有的注解都继承自java.lang.annotation.Annotation,Java提供的使用反射API读取Annotation的方法包括:

判断某个注解是否存在于ClassFieldMethodConstructor

使用反射API读取Annotation:

3. 实践 DEMO

需求:获取方法上注解的具体参数并输出

  1. 定义注解
/**
 * 定义注解
 *
 * @author Andrew
 * @date 2022/6/16
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Information {
    String name();

    int age();

    String[] hobbies();

    String address() default "中国";
}
  1. 使用注解
/**
 * 使用注解
 *
 * @author Andrew
 * @date 2022/6/16
 */
@Component
public class PersonService {


    @Information(name = "Evan", age = 18, hobbies = {"编程", "看电影", "踢足球"})
    public void outputPersonInfo(Person person) {
        if (person != null) {
            System.out.println(person.toString());
        }
    }
}
  1. 赋予注解功能
/**
 * 赋予注解功能
 *
 * @author Andrew
 * @date 2022/6/22
 */
@org.aspectj.lang.annotation.Aspect
@Component
public class Aspect {

    @Before("execution(public void com.zbm.test.controller.PersonService.*(..))")
    public void check() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        // 通过反射获取方法
        Method method = PersonService.class.getMethod("outputPersonInfo", Person.class);
        // 获取方法上的注解
        Information annotation = method.getAnnotation(Information.class);
        // 输出方法内容
        System.out.println("+++++++++++++" + annotation.address() + annotation.name() + annotation.age() + Arrays.toString(annotation.hobbies()));
        Person person = new Person();
        person.setAddress(annotation.address());
        person.setAge(annotation.age());
        person.setName(annotation.name());
        person.setHobbies(annotation.hobbies()[0]);
        // 执行方法
        method.invoke(new PersonService(), person);
    }
}

引用:

https://www.jianshu.com/p/faf79ece1d88

https://www.liaoxuefeng.com/wiki/1252599548343744/1265102413966176

标签:Class,String,自定义,class,person,注解,annotation
来源: https://www.cnblogs.com/Andrew-Zhou/p/16436068.html