超详细的Java自定义注解介绍

一、注解概述:
1.注解不会对代码本身产生直接的影响。
2.注解可以用来修饰类(@Controller)、方法(@RequestMapping)、变量(@Autowired)、参数(@RequestBody)、包。
3.注解是一种元数据形式,类似于类、接口等,
二、自定义注解的具体实现:
1.定义注解:给注解下一个定义
注意:访问的修饰符必须是public,不写默认是public,注解类型的元素智能是基本的数据类型、String、Class、枚举值类型、注解类型(嵌套);当只有一个元素的时候,尽量把名字起为value;元素的()里不能有任何参数;如果没有默认值那后续使用必须给元素赋值。
常用的元注解:
@Target:声明该注解可以应用于那些元素上

public enum ElementType {
    /** 类,接口(包括注解类型)或枚举的声明 */
    TYPE,
    /** 属性的声明 */
    FIELD,
    /** 方法的声明 */
    METHOD,
    /** 方法形式参数声明 */
    PARAMETER,
    /** 构造方法的声明 */
    CONSTRUCTOR
    /** 局部变量声明 */
    LOCAL_VARIABLE,
    /** 注解类型声明 */
    ANNOTATION_TYPE,
    /** 包的声明 */
    PACKAGE
}

@Retention:声明注解的生命周期,生命周期有三个阶段:1、Java源文件阶段;2、编译到class文件阶段;3、运行期阶段。我们实际开发中的自定义注解几乎都是使用的RetentionPolicy.RUNTIME

public enum RetentionPolicy {
    /**
     * (注解将被编译器忽略掉)
     */
    SOURCE,
    /**
     * (注解将被编译器记录在class文件中,但在运行时不会被虚拟机保留,这是一个默认的行为)
     */
    CLASS,
    /**
     * (注解将被编译器记录在class文件中,而且在运行时会被虚拟机保留,因此它们能通过反射被读取到)
    RUNTIME
}

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

@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(Person.class)
public @interface Info {
    String value() default "tracy";

    boolean isDelete();
}

2.配置注解到所需要生效的位置(类、方法、变量、参数、包)

@Data
@Info(isDelete = true)
public class Person {

    /**
     * 姓名
     */
    private String name;

    /**
     * 年龄
     */
    private int age;

    /**
     * 是否有效
     */
    private boolean isDelete;

}

3,解析注解,在编译阶段检测到注解,执行注解中所要执行的特殊操作。

@Info(isDelete = true)
public class Annotationtest {
    public static void main(String[] args) {
        Person person = new Person();
        Class clazz = person.getClass();
        if (clazz.isAnnotationPresent(Info.class)){
            System.out.println(true);
            Info infoAnno = (Info)clazz.getAnnotation(Info.class);
            System.out.println("person.name :" + infoAnno.value() + ",person.isDelete:" + infoAnno.isDelete());
        }else {
            System.out.println(false);
        }

    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值