Java-注解知识、整理学习。
注解和注释
注解:说明程序的,给计算机看的
注释:用文字描述程序的,给程序员看的
注解的概念:
注解(Annotation),也叫元数据。一种代码级别的说明。他是JDK1.5及以后版本引入的特性。与类、接口、枚举在同一个层次。他可以声明在包、类、字段、方法、局部变量、方法参数等前面,用来对这些元素进行说明、注释。
①jdk1.5之后出现的特性
②用来说明程序的
③使用方法:@注解名称
作用分类:
①编写文档:通过代码里标识的元数据生成文档【生成doc文档】
②代码分析:通过代码里标识的元数据对代码进行分析【使用反射】
③编译检查:通过代码里标识的元数据让编译器能够实现最基本的编译检查【如Override】
Java内置的基本注解:
- @Override:检测被该注解标注的方法是否是继承自父类(接口)的
- @Deprecated:该注解标注的内容表示已过时
- @SuppressWarnings:压制警告 一般传递参数“all”
- @SafeVarargs:“堆污染”警告。
- @FunctionalInterface:标注函数式接口,保证这个接口只有一个抽象方法,注意这个只能修饰接口
自定义注解:
- 格式:
- 元注解
- public @interface 注解名称{
- 属性列表
- }
- 本质:public interface MyAnno extends java.lang.annotation.Annotation{} 注解本质上就是一个接口,继承 java.lang.annotation.Annotation
- 属性(接口中可以定义的内容(抽象方法,就是注解的属性))
- 返回值类型 只有以下几种可以: 基本数据类型、String、枚举、注解、以上类型的数组,不能是void、类类型
- 定义了属性,在使用时需要给属性赋值,如果不想给某个属性赋值,则在定义注解内方法的时候 加default xxx,如:
-
public @interface MyAnno{ int age(); String name() default "鲁班七号"; }
- 如果只有一个属性需要赋值且这个属性名为value,则value=可以省略,如@MyAnno("鲁班七号")
- 枚举赋值:@MyAnno(per=Person.P1)
- 注解类型赋值:@MyAnno(anno=@Anno2)
- 数组类型赋值:@MyAnno(strs={"a","b","c"}) 数组赋值使用{}包裹。如果数组中只有一个值,则{}可以省略
元注解:用于描述注解的注解
@Target:描述注解能作用的位置 。 ElementType的取值:TYPE表示可以作用于类上;METHOD:可以作用于方法上;FIELD:可以作用于成员变量上
@Target(value={ElementType.TYPE,ElementType.METHOD,ElementType.FIELD}) 表示该注解可以作用于类上、方法上、成员变量上
@Retention:描述注解被保留的阶段
RetentionPolicy.RUNTIME(该注解会保留到class字节码文件中,并且被JVM读取。一般取这个值),RetentionPolicy.CLASS(该注解会保留到class字节码文件中,但不会被JVM读取。),RetentionPolicy.SOURCE(不会保留到class字节码文件中)
@Documented:描述注解是否被抽取到api文档中
@Inherited:描述注解是否被子类继承
在程序中解析(使用)我们定义的注解
获取注解中定义的属性值
定义注解
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface Pro { String className(); String methodName(); }
@Pro(className = "com.lhj.AnnoTest",methodName = "main") public class AnnoTest { public static void main(String[] args) { //获取注解定义的位置对象(class、method、field) Class<AnnoTest> annClass= AnnoTest.class; //获取指定注解 Pro pro= annClass.getAnnotation(Pro.class); //调用注解中的抽象方法获取配置的属性值 String className=pro.className(); String methodName=pro.methodName(); System.out.println(className); System.out.println(methodName); } }