Java魔法堂:自定义和解析注解

简介:

一、前言                            

  注解(Annotation)作为元数据的载体,为程序代码本身提供额外的信息,使用过MyBatis等ORM框架的朋友对 @Insert 的注解应该不陌生了,这是MyBatis自定义的注解,显然我们也可以按需求自定义一些注解,然后对其进行解析获取元数据,进而实现通过代码生成代码的操作。

 

二、自定义注解                         

 只需通过 关键字@interface 即可自定义注解

// 标识注解(就是无属性的注解)
public @interface AnnotationWithoutProperty{
}

// 带value属性的注解
public @interface AnnotationWithVal{
  String value();
}

// 带myVal属性的注解
public @interface AnnotationWithMyVal{
  String[] myValue();
}

// 带value和myVal属性的注解
public @interface AnnotationWith2Val{
  String value();
  String[] myValue();
}

// 带缺省值的myVal属性的注解
public @interface AnnotationWithDefaultVal{
  String myVal() default "hello world!";
}
使用方式如下:
@AnnotationWithoutProperty
@AnnotationWithVal("hello world") // value属性赋值时,不用显式写出属性名
@AnnotationWithMyVal(myValue={"hello", "world"}) // 其他属性赋值时,必须显示写出属性名
@AnnotationWith2Val(value="hello world", myVal={"hello", "world"})
@AnnotationWithDefaultVal // 属性拥有缺省值时,不必显示设置属性值
@AnnotationWithDefaultVal("new value")
public void test(){}

三、注解的注解                              

  注解的注解就是为注解本身提供额外的信息,从而约束或增强注解的能力。其中包含有 @Documented 、 @Inherited 、 @Target 、 Retention 4种注解。

   @Target注解 :用于约束被描述的注解的使用范围,当被描述的注解超出使用范围则编译失败。



// 约束@MyAnnotation的作用范围是函数和构造函数
@Target(ElementType.METHOD, ElementType.CONSTRUCTOR)
public @interface MyAnnotation{}

   @Retention注解 :用于约束被描述的注解的作用范围,注解的作用范围有三个,分别为

        1.  RetentionPolicy.SOURCE ,作用范围为源码,就是仅存在于java文件中,当执行 javac 命令时将会去除该注解。

        2.  RetentionPolicy.CLASS ,作用范围为二进制码,就是存在于class文件中,当执行 java 命令时会去除该注解。

        3.  RetentionPolicy.RUNTIME ,作用范围为运行时,就是我们可以通过反射动态获取该注解。

@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation{}

    @Documented注解 :用于指定javadoc生成API文档时显示该注解信息

    @Inherited注解 :用于指定被描述的注解可以被其所描述的类的子类继承。默认情况

// 默认注解不会被子类继承
@MyAnnotation
public class Parent{}

// Son并没有继承注解MyAnnotation
public class Son extends Parent{}

通过 @Inherited 子类将会继承父类的 @MyAnnoation注解 。

 

四、读取注解                                  

  通过反射我们可以获取类、函数等上的注解信息。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.CLASS)
@Documented
public @interface MyAnnotaion{
  String value() default "hello world";
}

@MyAnnotation
public class Test{
  public static void main(String[] args){
    MyAnnotation ma = Test.class.getAnnotation(MyAnnotation.class);
    System.out.println(ma.value());

    // 获取自身和从父类继承的注解
    Annotation[] annotations = Test.class.getAnnotations();
    // 仅获取自身的注解
    Annotation[] annotations = Test.class.getDeclaredAnnotations();
  }
}

目录
相关文章
|
10月前
JAVA-如何自定义一个注解
JAVA-如何自定义一个注解
|
9月前
|
XML 数据格式
java202304java学习笔记第六十五天-ssm-声明式控制-基于xml的声明式配置-知识要点
java202304java学习笔记第六十五天-ssm-声明式控制-基于xml的声明式配置-知识要点
38 0
|
11月前
|
XML 存储 JSON
java之路—— SpringMVC的常用注解解析以及作用、应用
java之路—— SpringMVC的常用注解解析以及作用、应用
154 0
|
11月前
java202304java学习笔记第六十天-ssm-spring配置文件-原始注解介绍
java202304java学习笔记第六十天-ssm-spring配置文件-原始注解介绍
38 0
|
12月前
java202304java学习笔记第六十天-ssm-spring配置文件-原始注解入门操作1
java202304java学习笔记第六十天-ssm-spring配置文件-原始注解入门操作1
47 0
|
12月前
java202304java学习笔记第六十天-ssm-spring配置文件-原始注解入门操作2
java202304java学习笔记第六十天-ssm-spring配置文件-原始注解入门操作2
40 0
|
12月前
java202304java学习笔记第六十天-ssm-spring配置文件-原始注解详解1
java202304java学习笔记第六十天-ssm-spring配置文件-原始注解详解1
36 0
|
12月前
java202304java学习笔记第六十天-ssm-spring配置文件-原始注解详解2
java202304java学习笔记第六十天-ssm-spring配置文件-原始注解详解2
42 0
|
12月前
java202304java学习笔记第六十天-ssm-spring配置文件-原始注解详解3
java202304java学习笔记第六十天-ssm-spring配置文件-原始注解详解3
36 0
|
12月前
java202304java学习笔记第六十天-ssm-spring配置文件-原始注解详解4
java202304java学习笔记第六十天-ssm-spring配置文件-原始注解详解4
38 0