介绍
注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以‘@注解名’在代码中存在的,根据注解参数的个数,我们可以将注解分为:标记注解、单值注解、完整注解三类。它们都不会直接影响到程序的语义,只是作为注解(标识)存在,我们可以通过反射机制编程实现对这些元数据(用来描述数据的数据)的访问。另外,你可以在编译时选择代码里的注解是否只存在于源代码级,或者它也能在class文件、或者运行时中出现(SOURCE/CLASS/RUNTIME)。Java中注解形式 @(注解名)
作用分类:
①编写文档:通过代码里标识的元数据生成文档【生成文档doc文档】
② 代码分析:通过代码里标识的元数据对代码进行分析【使用反射】
③编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查【Override】
常见注解
Java自带注解
@ override (表示覆盖的方法)@ deprecated(表示方法已经过时) @ suppvisewarning(表示忽略警告)
常见第三方注解
spring:@Autowired,@Service,@Repository;
mybatis:@InsertProvider,@UpdateProvider,@Options;
注解分类
按照运行机制分类
源码注解;
编译时注解(在源码和.class中都存在):@override;@Deprecated;@Suppvisewarnings
运行时注解(在运行阶段还会起作用,甚至会影响程序的运行逻辑):@Autowired
按照注解来源分类
来自jdk的注解,来自第三方的注解,自定义注解,元注解(给注解进行注解);
元注解:
@Target():注解的作用域
@Retention():注解的生命周期
@Inherit:允许子类继承,父类如果有注解,则子类会继承该注解信息
@Document:生成Javadoc会包含注解信息
自定义注解
package myannotation.test.com;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//表明该注解可以在方法和类上使用
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)//运行时
@Inherited//可以继承
@Documented
public @interface myannotation {//使用interface关键字
//成员类型受到限制
//合法类型包括基本类型以及String,class,annotation,enumeration
//如果注解的成员只有一个那么名字必须是value()
//在使用时可以忽略成员名和复制号(=)
//注解类可以没有成员
//此时称为标识注解
String desc();//成员以无参数无异常方式声明
String author();
int age() default 18;//可以用default来指定默认值
}
使用注解
package extense.test.com;
import myannotation.test.com.*;
public class Main {
@myannotation(author = “ming”, desc = “i’m hansome”,age=20)
public String face() {
return null;
}
}
解析注解
通过反射获取类,函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑。