java 命令模式 自定义注解 java实现自定义注解_自定义注解

一、注解的概念及作用

1.什么是注解

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

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

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

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

二、注解的分类

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

第一种:元注解

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

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

java 命令模式 自定义注解 java实现自定义注解_java 命令模式 自定义注解_02

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

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

java 命令模式 自定义注解 java实现自定义注解_元注解_03

注:上面的这些常量需要通过枚举类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());
}
}