【JAVA】注解Annotation类的学习和使用

版权声明:本文为博主原创文章,如需转载请注明出处,谢谢。喜欢请关注哟~ https://blog.csdn.net/sjt223857130/article/details/83215563

如何创建一个注解:@TransientFlex

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

//用于序列化的注解,使用此标记不会被序列化
@Retention(RetentionPolicy.RUNTIME)
public @interface TransientFlex {
}

@Documented: 用于标记在生成javadoc时是否将注解包含进去。

@Target:用于定义注解可以在什么地方使用,默认可以在任何地方使用。

  • TYPE : 类、接口或enum声明
  • FIELD: 域(属性)声明
  • METHOD: 方法声明
  • PARAMETER: 参数声明
  • CONSTRUCTOR: 构造方法声明
  • LOCAL_VARIABLE:局部变量声明
  • ANNOTATION_TYPE:注释类型声明
  • PACKAGE: 包声明

@Inherited:允许子类继承父类中的注解,可以通过反射获取到父类的注解。

@Constraint:用于校验属性值是否合法

@Retention:注解的声明周期,用于定义注解的存活阶段,可以存活在源码级别、编译级别(字节码级别)、运行时级别

  • SOURCE:源码级别,注解只存在源码中,一般用于和编译器交互,用于检测代码。如@Override, @SuppressWarings。
  • CLASS:字节码级别,注解存在于源码和字节码文件中,主要用于编译时生成额外的文件,如XML,Java文件等,但运行时无法获得。 如mybatis生成实体和映射文件,这个级别需要添加JVM加载时候的代理(javaagent),使用代理来动态修改字节码文件。
  • RUNTIME:运行时级别,注解存在于源码、字节码、java虚拟机中,主要用于运行时,可以使用反射获取相关的信息。

使用定义的注解:

public class Info {


    public int uid;

    @TransientFlex
    public String nickname;


    @TransientFlex
    public void setParser(Object data) {
    }

    @TransientFlex
    public Object getParser() {
        Object data = new Object();
        return data;
    }
}

获取属性或方法上的注解,判断是否包含某个注解:

        // 判断类的方法上是否存在某个注解
        Method[] methods = 类.class.getMethods();
        for (Method method : methods) {
            Annotation anno = method.getAnnotation(TransientFlex.class);
            if (anno != null) {
                System.out.println(method.getName() + "==>" + anno.toString());
            }
        }

        // 判断类的属性上是否存在注解
        Field[] fields = 类.class.getFields();
        for (Field field : fields) {
            Annotation anno = field.getAnnotation(TransientFlex.class);
            if (anno != null) {
                System.out.println(field.getName() + "==>" + anno.toString());
            }
        }

猜你喜欢

转载自blog.csdn.net/sjt223857130/article/details/83215563