Java基础强化(二) – 注解
一、注解概述
1.定义
注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
2.作用描述
(1)编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查[@Override]
(2)编写文档:通过代码里的标识的注解生成doc文档
(3)代码分析:通过代码里标识的注解对代码进行分析[使用反射]
3.JDK中预定义的注解
**@Override:**检测被改注释标注的方法是否是继承自父类(接口)的
**@Deprecated:**该注解标注的内容,标识已过时。即虽然可以使用,但是不推荐使用
**@SuppressWarnings:**压制警告
*一般传递参数all,@SuppressWarnings(“all”)
二、自定义注解
1.格式
元注解
public @interface 注解名称{
属性列表;
}
2.本质
注解本质是一个接口,该接口默认继承Annotation接口
>
>
>假设按照上述1.格式自定义一个接口My Anno,并通过反编译的方式,我们会得到一下结果
>
>public interface MyAnno extends java.lang.annotation.Annotation{}
3.属性:接口中的方法
要求:
(1)属性的返回值有一下列取值
- 基本数据类型
- String
- 枚举
- 注解
- 上述类型的数组
public @interface MyAnno{
int show1 ();
String show2();
Person show3() default "Person.p1";
@Override show4();
String[] show5();
}
(2)定义了属性,在使用时需要给属性赋值
(a)如果定义属性时,使用default 关键字给属性默认初始化,则使用注解时,可以不进行属性的赋值
(b)如果只有一个属性需要赋值,且这个属性名称是value,则“value=”可以省略,直接定义值即可
(c)数组赋值时,值使用{}包裹。如果数组中只有一个值,则{}可以省略
@MyAnno(show1=1,show2="hello",show4=@Override,show5={"abc","bcd"})
public class show{
}
4.元注解:用于描述注解的注解
常用的元注解有四个:
- @Target : 描述注解能够作用的位置
ElementType的取值:
* Type:表示注解可以作用于类上 * Method:表示注解可以作用于方法上 * Field:表示注解可以作用于成员变量上
@Retention:描述注解被保留的阶段
@Retention(RetentionPolicy.RUNTIME):当前被描述的注解,会保留到class字节码文件中,并被JVM读取到
@Documented:描述注解是否被抽取到API文档中
@Inherited:描述注解是否被子类继承
5.程序中对注解的解析
在程序中使用(解析)注解,获取注解中定义的属性值
(1)获取被注解的对象(类,方法,成员变量等)
(2)获取指定的注解
通过getAnnotation(class)方法
(3)调用注解中的抽象方法来获取配置的属性值
示例程序:
首先定义一个Prop注解,有两个属性:className用来存储类名,methodName用来存储方法名
@Target("ElementType.Type")
@Retention(RetentionPolicy.RUNTIME)
public @interface Prop{
String className();
String methodName() ;
}
则我们可以按如下方式使用并调用注解中的属性。
@Prop(className="cn.itcast.annotation.Demo1",methodName="show")
public class ReflectTest {
public static void main (String [] args) throws Exception{
//获取被注解的类字节码文件
Class<ReflectTest> reflectTestClass = ReflectTest.class ;
//获取类上的注解对象
Prop prop = reflectTestClass.getAnnotation(Prop.class);
//调用注解对象中定义的抽象方法,获取属性
String className = prop.className();
String methodName = prop.methodName();
}
}
对于以上程序调用我们可以理解成Java为我们自动生成了一个如下的Prop实现类:
public class PropImpl implments Prop{
public String className(){
return "cn.itcast.annotation.Demo1";
}
public String methodName(){
return "show" ;
}
}