java 自定义注释_java注解使用以及如何实现一个自定义注解

7ae208c74516ac77ebe75a5d5f13432a.png

一、注解的概念及作用

1.什么是注解

源代码中元数据的一种标记,注解本质上是一个继承自Annotation的类(一般通过反射的方式实现具体的功能)

2.注解的作用生成文档,根据文档注解,可以生成java文档

追踪代码依赖性,实现替代配置文件功能(最主要的功能)

在编译时进行格式检查,告知编译器哪些代码需要检查

二、注解的分类

1.按来源分(1)JDK注解

第一种:元注解

元注解就是用来定义注解的注解

@Target : 是注解的作用域,表示该注解可以用于一个类中的那些属性及方法上,如果作用域类型有多个用英文逗号分隔(空间上的有效范围)

613b22a4a9017a27e45532d83873b82a.png

注:上面的这些常量需要通过枚举类ElementType来引用,如ElementType.METHOD

@Retention : 注解的生命周期,表明该注解在什么时候起作用,什么时候失效(时间上的有效范围)

4b30567d052ef75a87f58d11b531cf00.png

注:上面的这些常量需要通过枚举类RetentionPolicy来引用,如RetentionPolicy.RUNTIME

@Inherited:此注解是标识性的元注解,表示当前注解可以由子注解来继承

@Documented:表示生成javadoc的时候会包含注解

第二种:普通注解

@Override : 标记它覆盖了它的父类或接口的方法

@Deprecated : 标记该方法或字段不再推荐使用

(2)第三方类库或框架注解

由第三方类库或框架定义的注解,比如Spring中的注解@Controller

(3)自定义注解

自身项目根据项目需要实现的针对项目的自定义注解

2.按作用的生命周期分源码注解:在源码时起作用,在编译时失效

编译时注解:在编译时起作用,在运行时失效

运行时注解:只在运行时起作用

三、注解的使用

1.使用jdk注解和第三方注解

在使用jdk注解或第三方注解,只需要在使用的地方直接标注注解即可

(1)使用jdk的注解

@Documented

publicUser{

}

(2)使用Spring的注解

@Controller

publicclassHelloController{

}

2.使用自定义注解

注:注解只是一种标记,如果不解析,它是不会实现任何功能的

(1)定义注解:定义标记

定义标记需要使用元注解

使用元注解@Target来标记该注解的作用范围(空间范围,在哪些地方可以使用)

使用元注解@Retention来标记该注解的作用时间范围(时间范围,在什么时候起作用)

使用元注解@Inherited来标记该注解是否可以由子注解来继承

使用元注解@Documented来标记该注解是否需要自动生成文档

使用@interface关键词来定义注解

在注解内部定义一些相关的属性,一般是方法的形式来定义属性

packagemain.java.com.shixinke.java.demo.annotation;

importjava.lang.annotation.*;

@Target({ElementType.ANNOTATION_TYPE,ElementType.METHOD})

@Retention(RetentionPolicy.RUNTIME)

@Inherited

@Documented

public@interfaceCheck{

booleanvalue()defaultfalse;

}

注:自定义注解本质上是继承自Annotation的类

(2)标记注解:打标,表明此处要使用此标记

定义一个User类,标记为@Check

packagemain.java.com.shixinke.java.demo.annotation;

@Check(true)

publicclassUser{

}

定义一个Person类,不标记

packagemain.java.com.shixinke.java.demo.annotation;

publicclassPerson{

}

(3)解析注解:扫描标记,实现功能

一般通过反射来实现扫描注解,并在解析器中实现功能:

注解解析器来解析注解并实现功能

packagemain.java.com.shixinke.java.demo.annotation;

importjava.lang.annotation.Annotation;

publicclassCheckParser{

publicvoidparse(Classcls){

/**

* 获取Check的注解对象

*/

Annotationannotation=cls.getAnnotation(Check.class);

Checkcheck=(Check)annotation;

/**

* 检查是否有Check注解,并且注解的value属性为true

*/

if(check!=null&&check.value()){

System.out.println(cls.getName()+"在检查中........");

}

}

}

调用注解解析器

packagemain.java.com.shixinke.java.demo.annotation;

publicclassAnnotationDemo{

publicstaticvoidmain(String[]args){

Useruser=newUser();

Personperson=newPerson();

CheckParserparser=newCheckParser();

parser.parse(user.getClass());//main.java.com.shixinke.java.demo.annotation.User在检查中........

parser.parse(person.getClass());

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值