Java反射解析自定义注解

£神魔★判官ぃ 2023-06-13 11:18 71阅读 0赞

Java反射解析自定义注解

  • 自定义注解
    • 注解定义配置参数不设置默认值
    • 注解定义配置参数并设置默认值
    • 使用反射技术解析自定义注解

自定义注解

  1. 1.自定义注解需要使用@interface关键字。自定义注解自动继承了java.lang.annotation.Annotation接口。

注解定义配置参数不设置默认值

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注解定义配置参数并设置默认值

  1. 通过default关键字来声明配置参数的默认值。

在这里插入图片描述
在这里插入图片描述

使用反射技术解析自定义注解

  1. 目前流行框架都是:注解+反射+设计模式。所以自定义完注解后,需要使用反射技术来解析。
  2. 如果只是单纯定义注解,不做任何处理,将毫无意义。

自定义注解代码

  1. package cn.xxxq.annotation;
  2. import java.lang.annotation.ElementType;
  3. import java.lang.annotation.Retention;
  4. import java.lang.annotation.RetentionPolicy;
  5. import java.lang.annotation.Target;
  6. @Retention(RetentionPolicy.RUNTIME)
  7. @Target(ElementType.TYPE)
  8. public @interface MyAnnotation {
  9. /* 这个方法相当于定义了一个配置参数: 1.参数名称是方法名。 2.参数类型是方法返回值类型。 类型只能是八种基本类型、String类型、Class类型、enum类型、Annotation类型 */
  10. String[] name();
  11. /*不能是包装类型*/
  12. // Integer[] height();
  13. char sex();
  14. // String[] value() default "javaee"; //也可以只给一个值 String[] value() default { "java","javaee"};
  15. int age() default 21;
  16. }

解析注解代码

  1. package cn.xxxq.annotation;
  2. import java.lang.annotation.Annotation;
  3. import java.util.Arrays;
  4. import java.util.stream.Stream;
  5. /* name和sex参数没有默认值所以必须赋值 value和age参数有默认值了,可以不赋值 */
  6. @MyAnnotation(name = "zwq",sex = '男') public class MyAnnotationTest {
  7. public static void main(String[] args) {
  8. String className = "cn.xxxq.annotation.MyAnnotationTest";
  9. printMsgForAnnotation(className);
  10. }
  11. /** * 输出一个类上所有注解的信息 * @param className 类的全限定名称 */
  12. public static void printMsgForAnnotation(String className){
  13. try {
  14. /*获取指定类的字节码对象*/
  15. Class<?> clazz = Class.forName(className);
  16. //获得类上所有的注解
  17. Annotation[] annotations = clazz.getAnnotations();
  18. /*Stream流打印所有注解*/
  19. Stream.of(annotations).forEach(System.out::println);
  20. /*获得类上指定的注解*/
  21. MyAnnotation annotation = clazz.getAnnotation(MyAnnotation.class);
  22. /*打印该注解value参数的值*/
  23. System.out.println(Arrays.asList(annotation.value()));
  24. } catch (ClassNotFoundException e) {
  25. e.printStackTrace();
  26. }
  27. }
  28. }

解析结果

  1. @cn.xxxq.annotation.MyAnnotation(value=[java, javaee], age=21, name=[zwq], sex=男)
  2. [java, javaee]

发表评论

表情:
评论列表 (有 0 条评论,71人围观)

还没有评论,来说两句吧...

相关阅读