自定义注解

自定义注解

Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。Java 语言中的类、方法、变量、参数和包等都可以被标注。和 Javadoc 不同,Java 标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容 。 当然它也支持自定义 Java 标注。

元注解

JDK中自带了专门修饰注解的修饰,它是为了能更好地设计自定义注解的细节而专门设计的

一、@Target

指定注解能修饰的对象,@Target注解参数:

public enum ElementType {
    /** 类, 接口 (包括注解类型), 或者枚举的声明
    *   Class, interface (including annotation type), or enum declaration
    */
    TYPE,

    /** 属性的声明 (包括枚举常量) 
    *   Field declaration (includes enum constants)
    */
    FIELD,

    /** 方法的声明 
    *   Method declaration
    */
    METHOD,

    /** 参数形式的声明 
    *   Formal parameter declaration
    */
    PARAMETER,

    /** 构造方法的声明 
    *   Constructor declaration
    */
    CONSTRUCTOR,

    /** 局部变量的声明 
    *   Local variable declaration
    */
    LOCAL_VARIABLE,

    /** 注解类型的声明 
    *   Annotation type declaration
    */
    ANNOTATION_TYPE,

    /** 包的声明 
    *   Package declaration
    */
    PACKAGE,

    /**
     * 类型参数的声明
     * Type parameter declaration
     * @since 1.8
     */
    TYPE_PARAMETER,

    /**
     * 表示该注解能写在使用类型的任何语句中(eg:声明语句、泛型和强制转换语句中的类型)
     * Use of a type
     * @since 1.8
     */
    TYPE_USE
}

二、@Retention

指定注解的生命周期,@Retention注解参数:

public enum RetentionPolicy {
    /**
     * Java源文件阶段
     * Annotations are to be discarded by the compiler.
     */
    SOURCE,

    /**
     * Class文件阶段
     * Annotations are to be recorded in the class file by the compiler
     * but need not be retained by the VM at run time.  This is the default
     * behavior.
     */
    CLASS,

    /**
     * 运行阶段
     * Annotations are to be recorded in the class file by the compiler and
     * retained by the VM at run time, so they may be read reflectively.
     *
     * @see java.lang.reflect.AnnotatedElement
     */
    RUNTIME
}

三、@Documented

指定自定义注解是否能随着被定义的java文件生成到JavaDoc文档当中

四、@Inherited

指定某个自定义注解如果写在了父类的声明部分,那么子类的声明部分也能自动拥有该注解。@Inherited注解只对那些@Target被定义为ElementType.TYPE的自定义注解起作用。

自定义注解

一、定义注解

/**
 * 自定义注解
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface myAnnotation {
    public String value() default "";
}

二、配置注解

public class Student {
    @myAnnotation("10")
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

三、解析注解

public class Test {
    public static void main(String[] args) {
        try {
            //获取Student的Class对象
            Class aClass = Class.forName("demo1.test.Student");
            //获取构造器,创建一个Student实例
            Constructor constructor =  aClass.getConstructor();
            Student student = (Student) constructor.newInstance();
            //获取name属性
            Field fields = aClass.getDeclaredField("name");
            fields.setAccessible(true);
            //判断name属性上是否有注解
            if (fields.isAnnotationPresent(myAnnotation.class)){
                //获取注解
                Annotation annotation = fields.getAnnotation(myAnnotation.class);
                //通过注解给name赋值
                fields.set(student,((myAnnotation) annotation).value());
            }
            //打印student的name属性
            System.out.println(student.getName());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

打印结果


  转载请注明: 我所希冀的未来 自定义注解

 上一篇
WindChill备份、恢复和迁移 WindChill备份、恢复和迁移
WindChill备份、恢复和迁移WindChill备份WindChill恢复WindChill迁移一、前置配置修改目标主机的hosts文件,增加源WindChill目录所需的DNS映射如: 127.0.0.1 chenbowen.e-l
2020-11-13
下一篇 
枚举 枚举
枚举类型定义public enum ActionCodeEnum{ CREATE("create"), UPDATE("update"), QUERY("query"), DELETE("delete");
2020-11-13
  目录