注解不是注释,注释是程序员写的,给程序员看的。注解给程序看,用于描述程序如何运行及在什么阶段来运行。
现在在实际开发中,注解最大的功能是用于替换配置文件
。
注解是
jdk1.5
的新特性。
可以通过反射
来让注解具有功能
。
注解格式: @Xxxx
2.1 JDK中的三个基本的注解:
a. @Override 检查子类确实是覆盖了父类的方法。
b. @Deprecated 说明已经过时了。
c. @SuppressWarnings({ "unused", "deprecation", "rawtypes" }) 抑制程序中的警告。unused(变量未使用)
、deprecation(过时)
和rawtypes(泛型)
表示警告的类型。{}数组。
d. @SuppressWarnings("all") all抑制所有警告。
示例代码如下:
package com.itheima.demo1;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class Demo1 {
// @SuppressWarnings({ "unused", "deprecation", "rawtypes" })
@SuppressWarnings("all")
public void ff() {
int i = 0;
System.out.println("abc");
List list = new ArrayList();
System.out.println(new Date().toLocaleString());
}
public void HaHa() {
}
}
class Demo2 extends Demo1 {
@Override
public void ff() {
}
@Deprecated
public void HaHaHa() {
System.out.println(new Date().toLocaleString());
}
}
2.2 自定义注解的语法(注解的肉体
)
研究一下注解的本质:
声明一个注解(或者创建一个注解类): @interface 注解名{…}
public @interface MyAnnotation {}
通过反编译可知,注解它的本质
就是一个接口
,这个接口需要继承 Annotation接口
。但是不能按照下述的代码格式写,需要按照上述代码格式写。
public interface MyAnnotation extends java.lang.annotation.Annotation {...}
分析注解类中的成员:
注解本质上就是接口,我们知道接口中可以有属性和方法。
属性:public static final int age;
方法:public abstract void show();
但是在注解中也可以有属性,也可以有方法。但是,注解中一般不使用属性。
在注解的开发中,我们只写方法。
我们管注解中的方法,叫做注解的属性。
在注解中我们管方法的返回值叫做注解的类型。
注解定义属性的格式 : 例如:int age();
关于注解的属性类型可以有哪些?
1. 基本类型
2. String
3. 枚举类型
4. 注解类型
5. Class类型
6. 以上类型的一维数组类型
注解
:就是在你的程序代码中的某个位置加了一个标记
而已。
示例代码如下图所示:
2.3 注解的反射(注解的灵魂)
模拟 Junit 的 @Test 方法
a、反射注解类
java.lang.reflect.AnnotatedElement
;
< T extends Annotation > T getAnnotation(Class< T > annotationType) 得到指定类型的注解引用。没有,返回null。
Annotation[] getAnnotations() 得到所有的注解,包含从父类继承下来的。
Annotation[] getDeclaredAnnotations() 得到自己身上的注解。
boolean isAnnotationPresent(Class< ? extends Annotation > annotationType) 判断指定的注解有没有。
Class
、Method
、Field
、Constructor
等实现了AnnotatedElement接口
。
例如:
Class.isAnnotationPresent(MyTest.class); 判断类上面有没有@MyTest注解。
Method.isAnnotationPresent(MyTest.class); 判断方法上面有没有@MyTest注解。
b、反射注解中的属性
如下图元注解图片中所示:
2.4 元注解
a、自定义注解的存活范围(生命周期):默认是CLASS。
什么是
元注解
? 答:只能用在注解类上的注解叫做元注解。(即:用于
修饰注解的注解
)
@Retention
作用:改变自定义注解的存活范围。
RetentionPolicy
SOURCE
CLASS
RUNTIME
例如:@Retention(RetentionPolicy.RUNTIME)
@Target
作用:指定该注解能用在什么地方。
ElementType
TYPE
METHOD
FIELD
ANNOTATION_TYPE
例如:@Target({ ElementType.METHOD, ElementType.TYPE })
@Documented
作用:使用了@MyTest的注解的类,如果@MyTest注解类上面有@Documented注解,那么使用了@MyTest的注解的类的API文档中会出现@MyTest的身影。@Inherited
作用:说明使用了该注解的类的子类可以继续使用该注解。
示例代码如下图所示: