【Java注解】自定Java义注解

一、什么是注解

  Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。

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

 

二、元注解

  JDK5.0提供了4个元注解:@Target、@Retention、@Documented、@Inherited,JDK8.0后增加了2个注解:@Repeatable、@Native。

 

1、@Target

表示注解可以用在的地方,该注解需要ElementType类型的参数:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    /**
     * 返回注注解型可应用于的元素类型的数组。
     */
    ElementType[] value();
}

 

ElementType为枚举类型:

public enum ElementType {
    /** 类、接口(包括注解类型)或枚举声明 */
    TYPE,// 

    /** 字段声明(包括枚举常量) */
    FIELD,

    /** 方法声明 */
    METHOD,

    /** 正式的参数声明 */
    PARAMETER,

    /** 构造函数声明*/
    CONSTRUCTOR,

    /** 局部变量声明 */
    LOCAL_VARIABLE,

    /** 注解类型声明 */
    ANNOTATION_TYPE,

    /** 包声明 */
    PACKAGE,

    /**
     *JDK8.0增加,类型参数声明
     */
    TYPE_PARAMETER,

    /**
     *JDK8.0增加,类型的使用
     */
    TYPE_USE
}

 

2、@Retention

表示注解的声明周期,该注解需RetentionPolicy类型参数:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
    /**
     * 返回保留策略
     */
    RetentionPolicy value();
}

RetentionPolicy为枚举类型:
public enum RetentionPolicy {
    /**
     * Java源文件阶段
     */
    SOURCE,

    /**
     *Java文件编译为class文件阶段
     */
    CLASS,

    /**
     *运行阶段
     */
    RUNTIME
}

 

3、@Documented

类和方法的 Annotation 在缺省情况下是不出现在 javadoc 中的。如果使用 @Documented 修饰该 Annotation,则表示它可以出现在 javadoc 中。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}

 

4、@Inherited

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

 

5、@Repeatable

@Repeatable注解表明标记的注解可以多次应用于相同的声明或类型。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}

 

6、@Native

指示可以从本机代码引用定义常数值的字段。生成本机头文件的工具可以使用该注释作为提示,以确定是否需要头文件,如果需要,应该包含哪些声明(只对字段有效)。

@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.SOURCE)
public @interface Native {
}

 

三、自定义注解

1、定义注解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationTest {
    String value() default "";
}

 

2、注解绑定

public class EntityTest {

@AnnotationTest("测试")
private String test;

public String getTest() {
return test;
}

public void setTest(String test) {
this.test = test;
}
}

 

3、反射获取注解

public class TestAnnotation {
    public static void main(String[] args) throws Exception{
        Class cls = Class.forName("com.example.entity.EntityTest");
        Field[] fields = cls.getDeclaredFields();
        for(Field field : fields){
            if(field.isAnnotationPresent(AnnotationTest.class)){
                AnnotationTest annotationTest = field.getAnnotation(AnnotationTest.class);
                System.out.println(annotationTest.value());
            }
        }
    }
}

 

四、运行结果

 

posted @ 2021-03-02 22:39  lightbc  阅读(83)  评论(0编辑  收藏  举报