自定义注解的创建过程

注解的定义
注解是一种能被添加到java代码中的元数据,类、方法、变量、参数和包都可以用注解来修饰。注解可以看作是一种特殊的标记,可以用在方法、类、参数和包上,程序在编译或者运行时可以检测到这些标记而进行一些特殊的处理。
注解的基本元素

  1. 修饰符

访问修饰符必须为public,不写默认为pubic;

  1. 关键字

@interface;

  1. 注解名称

注解名称为自定义注解的名称,使用时还会用到;

  1. 注解类型元素

注解类型元素是注解中内容,可以理解成自定义接口的实现部分;

@Component
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface JavaBean {
    String value() default "";
}

使用元注解修饰注解
元注解:修饰注解的注解

  1. @Target
    Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标。作用:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    ElementType[] value();
}

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,

    /**
     *1.8版本新增,应用于类型变量 Type parameter declaration
     *
     * @since 1.8
     */
    TYPE_PARAMETER,

    /**
     *  1.8版本新增,能标注任何类型名称Use of a type
     *
     * @since 1.8
     */
    TYPE_USE
}
  1. @Retention
    Retention注解有一个属性value,是RetentionPolicy类型的,Enum RetentionPolicy是一个枚举类型.RetentionPolicy有3个值:CLASS 、RUNTIME 、SOURCE
    作用: 表明该注解的生命周期
    按生命周期来划分可分为3类:
    1、RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;
    2、RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期;
    3、RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;

    一般如果需要在运行时去动态获取注解信息,那只能用 RUNTIME 注解,比如@Deprecated使用RUNTIME注解
    如果要在编译时进行一些预处理操作,比如生成一些辅助代码(如 ButterKnife),就用 CLASS注解;
    如果只是做一些检查性的操作,比如 @Override 和 @SuppressWarnings,使用SOURCE 注解。

    注解@Override用在方法上,当我们想重写一个方法时,在方法上加@Override,当我们方法的名字出错时,编译器就会报错
    注解@Deprecated,用来表示某个类或属性或方法已经过时,不想别人再用时,在属性和方法上用@Deprecated修饰
    注解@SuppressWarnings用来压制程序中出来的警告,比如在没有用泛型或是方法已经过时的时候
  2. @Document
    表明该注解标记的元素可以被Javadoc 或类似的工具文档化
  3. @Inherited
    表明使用了@Inherited注解的注解,所标记的类的子类也会拥有这个注解
@Data
@Builder
@JavaBean
public class Person {
    /**
     * 姓名
     */
    private String name;
    /**
     * 年龄
     */
    private int age;
    /**
     * 性别
     */
    private String sex;
}
    @Test
    public void annotationTest(){
        //实例化person
       Person  p = Person.builder().build();
       //获取person的二进制文件
        Class<? extends Person> aClass = p.getClass();
        //判断person类上有没有javabena注解
        if(aClass.isAnnotationPresent(JavaBean.class)){
        //获取person类上的javabean注解
            JavaBean annotation = aClass.getAnnotation(JavaBean.class);
            System.out.println("该类上配置了javaben注解");
        }else {
            System.out.println("该类上没有配置javaben注解");
        }

    }

运行结果

该类上配置了javaben注解
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值