Java注解
什么是Java的注解?
定义:
注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
作用分类:
①编写文档:通过代码里标识的注解生成文档【生成文档doc文档】
②代码分析:通过代码里标识的注解对代码进行分析【使用反射】
③编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查【Override】
JDK中预定义的一些注解
@Override :表示被该注解标注的方法继承自父类(接口)
@Deprecated:表示该注解标志的内容已经过时,不推荐使用
@SuppressWarnings:去除警告
一般传递参数all @SuppressWarnings("all")
自定义注解
元注解
public @interface 注解名称{
属性列表;
}
javac Anno1.java
javap Anno1.class
Compiled from “Anno1.java”
public interface Anno1 extends java.lang.annotation.Annotation {
}
通过对一个空属性列表的Anno1注解进行编译和反编译后,得到:
public interface Anno1 extends java.lang.annotation.Annotation {
}
可见注解本质上就是一个接口
,该接口默认继承Annotation接口
作为接口,注解里可以有抽象方法,这些方法称为注解的属性。
属性的返回值类型
有下列取值:
-
基本数据类型
-
String
-
枚举
-
注解
-
由上述四种类型构成的数组
测试 定义一个注解Anno1,使用五种返回值类型方法
public @interface Anno1 {
int age();
String name() default "无名";
Hobby hobby();
Anno2 anno();
String[] strs();
}
定义一个实体类Student使用该注解的属性
@Anno1(age=18,hobby = Hobby.dangce,anno = @Anno2,strs={"str111","str222","str333"})
public class Student {
}
定义了属性,在使用时需要给属性赋值
1.如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性的赋值。
2.如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可。
3.数组赋值时,值使用{}包裹。如果数组中只有一个值,则{}可以省略
元注解
元注解:用于描述注解的注解
* @Target:描述注解能够作用的位置
* ElementType取值:
* TYPE:可以作用于类上
* METHOD:可以作用于方法上
* FIELD:可以作用于成员变量上
* @Retention:描述注解被保留的阶段
* @Retention(RetentionPolicy.RUNTIME):当前被描述的注解,会保留到class字节码文件中,并被JVM读取到
* @Documented:描述注解是否被抽取到api文档中
* @Inherited:描述注解是否被子类继承
那么可以注解后,注解的属性值如何使用呢?
注解的解析:
- 获取注解定义的位置的对象 (Class,Method, Field)
- 获取指定的注解
- 调用注解中的抽象方法获取配置的属性值
public class Test {
public static void main(String[] args) {
Class stuCls = Student.class;
Anno1 anno = (Anno1) stuCls.getAnnotation(Anno1.class);
System.out.println(anno);
int age = anno.age();
String name = anno.name();
Hobby hobby = anno.hobby();
String[] strs = anno.strs();
Anno2 anno1 = anno.anno();
System.out.println("age="+age+",name="+name+",hobby="+hobby+",anno1="+anno1+",strs="+ Arrays.toString(strs));
}
}
输出结果:
@com.codesy.annotation.Anno1(name=无名, age=18, hobby=dangce, anno=@com.codesy.annotation.Anno2(), strs=[str111, str222, str333])
age=18,name=无名,hobby=dangce,anno1=@com.codesy.annotation.Anno2(),strs=[str111, str222, str333]