自定义注解
程序员文章站
2022-06-22 16:06:22
...
自定义注解
1、最简单的自定义注解
package annotation; public @interface HpuAnnotation { // 注解相当于一个特殊的类型,与Enum 、 Interface类似 }
2、测试自定义的注解
package annotation; @HpuAnnotation public class AnnotationTest { public static void main(String[] args) { // 判断AnnotationTest 是否添加了HpuAnnotation注解 if(AnnotationTest.class.isAnnotationPresent(HpuAnnotation.class)) { // 获取AnnotationTest上面相应的注解 HpuAnnotation annotation = AnnotationTest.class.getAnnotation(HpuAnnotation.class); // 打印注解信息 System.out.println(annotation); } } }
运行结果 : 不输出任何信息
原因:自定义注解有有三种保留策略:
- --RetentionPolicy.CLASS
- --RetentionPolicy.RUNTIME
- --RetentionPolicy.SOURCE
java语句执行的过程中包括三个阶段,第一个阶段是源文件阶段,即.java文件阶段;第二个阶段是Class阶段,即由源文件编译形成.class文件;第三个阶段是运行阶段,即由类加载器将.class文件加载进入内存,形成字节码的阶段。而自定义注解的默认保留策略为:class阶段,即.class文件里面有注解的信息,但是将.class文件加载进入内存的时候,会忽略掉注解信息。
If no Retention annotation is present on an annotation type declaration, the retention policy defaults to RetentionPolicy.CLASS.
故在自定义的注解上加上注解@Retention(RetentionPolicy.RUNTIME)设定保留策略后,就可以得到想要的结果了。
运行结果为:@annotation.HpuAnnotation()
3、在自定义注解上添加注解 @Target(value=ElementType.METHOD) 可以设定自定义注解的使用位置
- --METHOD 只能加在方法上
- --TYPE 只能加在类上
- --CONSTRUCTOR 只能加在构造方法上
- --FIELD 只能加在字段上
- --LOCAL_VARIABLE 只能加在局部变量上
- --PACKAGE 加在包上面
- --PARAMETER 加在参数上面
- --ANNOTATION_TYPE 注释类型声明
4、给自定义注解添加属性,在注解里面属性的存在形式为方法,属性值与返回值的类型一样。注解里面所有方法的默认类型为public abstract 类型的。如下(给注解添加一个属性color,其值的类型要求是String):
// 注解相当于一个特殊的类型,与Enum 、 Interface类似 @Retention(RetentionPolicy.RUNTIME) @Target(value={ElementType.METHOD,ElementType.TYPE,ElementType.FIELD}) public @interface HpuAnnotation { // 属性名:color 属性值类型:java.lang.String String color(); }
测试方法:
@HpuAnnotation(color="red") public class AnnotationTest { public static void main(String[] args) { // 判断AnnotationTest 是否添加了HpuAnnotation注解 if(AnnotationTest.class.isAnnotationPresent(HpuAnnotation.class)) { // 获取AnnotationTest上面相应的注解 HpuAnnotation annotation = AnnotationTest.class.getAnnotation(HpuAnnotation.class); // 获取注解中属性的值,获取方式通过调用相应的方法 System.out.println(annotation.color()); } } }
设置默认属性值:
// 属性名:color 属性值类型:java.lang.String
String color() default "blue";
当属性名为value的时候,且只需要设定value属性的时候,可以不用写value=,而直接在注解后面写上值即可。
@MetaAnnotation("wcj")
5、属性的多种值类型
自定义枚举类型,用于作为注解属性值类型:
public enum Color { RED,GREEN,YELLOW }
自定义注解类型,用于作为注解属性值的类型:
public @interface MetaAnnotation { String value(); }
自定义的多种属性值注解:
// 注解相当于一个特殊的类型,与Enum 、 Interface类似 @Retention(RetentionPolicy.RUNTIME) @Target(value={ElementType.METHOD,ElementType.TYPE,ElementType.FIELD}) public @interface HpuAnnotation { // 属性名:color 属性值类型:java.lang.String String color() default "blue"; // 属性名:enumColor 属性值类型:Enum Color enumColor(); // 属性名:array 属性值类型:int[] int[] array(); // 属性名: annotation 属性值类型:@interface MetaAnnotation annotation() default @MetaAnnotation("wcj"); }
测试各种属性值类型:
@HpuAnnotation(enumColor=Color.GREEN,array={1,2,3},annotation=@MetaAnnotation("xy")) public class AnnotationTest { public static void main(String[] args) { // 判断AnnotationTest 是否添加了HpuAnnotation注解 if(AnnotationTest.class.isAnnotationPresent(HpuAnnotation.class)) { // 获取AnnotationTest上面相应的注解 HpuAnnotation annotation = AnnotationTest.class.getAnnotation(HpuAnnotation.class); // 获取注解中属性的值,获取方式通过调用相应的方法 System.out.println(annotation.color()); // 获取属性值类型为Enum System.out.println(annotation.enumColor()); // 获取属性值类型为int[] int[] arr = annotation.array(); System.out.print("["); for(int i = 0; i < arr.length; i++) { if(i != arr.length - 1) { System.out.print(arr[i] + ","); } else { System.out.print(arr[i]); } } System.out.println("]"); // 获取属性值类型为@interface System.out.println(annotation.annotation()); } } }
运行结果:
blue
GREEN
[1,2,3]
@annotation.MetaAnnotation(value=xy)
上一篇: spring学习-IoC和DI
下一篇: Spring学习——IOC&DI学习笔记