java注解初步学习和使用

    科技2022-08-07  95

    1 自定义注解之@Target、@Retention注解和@Documented

    参考:https://blog.csdn.net/github_35180164/article/details/52118286 https://www.jianshu.com/p/ba1d384dceec

    2.1 @Target注解

    @Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。 看下自定义注解的简单使用方式,定义3个运行时注解:

    // 适用类、接口(包括注解类型)或枚举 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface ClassInfo { String value(); } // 适用field属性,也包括enum常量 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface FieldInfo { int[] value(); } // 适用方法 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MethodInfo { String name() default "long"; String data(); int age() default 27; }

    2.2 @Retention注解

    1、RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃; 2、RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期; 3、RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;

    2.3 @Documented注解

    这3个生命周期分别对应于:Java源文件(.java文件) —> .class文件 —> 内存中的字节码。 Documented 注解表明这个注解应该被 javadoc工具记录. 默认情况下,javadoc是不包括注解的. 但如果声明注解时指定了 @Documented,则它会被 javadoc 之类的工具处理, 所以注解类型信息也会被包括在生成的文档中

    2 自定义注解之@AliasFor注解(用于为注解属性声明别名)

    参考:https://www.jianshu.com/p/d6bba708100d 在同个注解中为同一个功能定义两个名称不一样的属性,那么这两个属性彼此互为别名,别名的作用也就是在定义多个属性时为了能做到顾名思义,随意用都行。

    2.1 显式别名

    @AnonymousAccess @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented @RequestMapping(method = RequestMethod.DELETE) public @interface AnonymousDeleteMapping { @AliasFor(annotation = RequestMapping.class) String name() default ""; @AliasFor(annotation = RequestMapping.class) String[] value() default {}; @AliasFor(annotation = RequestMapping.class) String[] path() default {}; @AliasFor(annotation = RequestMapping.class) String[] params() default {}; }

    这里的四组别名用法是一致的!AnonymousDeleteMapping中的name、value、path和params是彼此的显性别名,使用的时候可以通过任意属性名来指定。 (注:@AliasFor的annotation属性必须引用元注解,被引用的元注解必须放置在声明了@AliasFor的注解类上,如RequestMapping;因为annotation是RequestMapping类,需要传入的是地址;) 具体使用:

    @RequestMapping(value = "/login") @AnonymousPostMapping(value = "/login") @AnonymousPostMapping(path = "/login")

    2.2 隐式别名

    如果注解中的一个或多个属性声明为同一个元注解属性的属性重写(直接地或传递地重写)那么这些注解会被当作彼此的隐性别名集来对待

    @ContextConfiguration public @interface MyContextConfiguration{ @AliasFor(annotation = ContextConfiguration.class, attribute = "locations") String[] values() default {}; @AliasFor(annotation = ContextConfiguration.class, attribute = "locations") String[] path() default {}; }

    @MyContextConfiguration中,valueh和path都是复写了@ContextConfiguration中locations属性。 具体使用:

    @ContextConfiguration(locations = {}) @MyContextConfiguration(values = {})

    2.3 使用规则

    参考上面url即可。

    Processed: 0.012, SQL: 8