注释:注解作用于(类,成员属性,方法,构造器,参数)
1 预定义注解
(1) @Deprecated // 标记对象为以过时
(2) @SupperessWarnings("all") // 忽略标记对象警告
(3) @Override // 检查目标重载
2 自定义注解
注释:自定义注解本质上是,实现(Annotation)接口的接口
(1) 定义注解: public @interface 注解名 { }
(2) 定义注解属性:类型 属性名();
java
public @interface 注解名 {
byte typeA(); // 基本类型
short typeB(); // 基本类型
int typeC(); // 基本类型
long typeD(); // 基本类型
double TypeE(); // 基本类型
float typeF(); // 基本类型
boolean typeG(); // 基本类型
char typeH(); // 基本类型
String typeI(); // String
TestEnum typeJ(); // 枚举
AnnoF1 typeK(); // 注解
int [] typeL(); // 数组
String[] typeM(); // 数组
TestEnum[] typeN(); // 数组
AnnoF1[] typeO(); // 数组
}
(3) 设置属性值:属性名=值;
java
@注解名(
typeA=1,
typeB=0,
typeC=0,
typeD=0,
typeE=0,
typeF=0,
typeG=false,
typH=0,
typeI="",
typeJ=TestEnum.A,
typeK=@AnnoF1(""),
typeL={0},
typeM={""},
typeN={TestEnum.B}
typeO={@AnnoF1("")}
)
...
(4) 属性默认值:default
注释:指定了默认值的属性,使用时可以不指定初期値
java
public @interface 注解名 {
String value() default "xxx";
}
(5) 默认属性:
注释:如果属性只有value,使用时可以不指定属性名
java
public @interface AnnoF1 {
String value();
}
@AnnoF1("默认值")
public void testMethod() {...}
3 元注解
注释:元注解是用于描述注解的注解
(1) @Target // 描述注解生效位置
**ElementType.**TYPE(类或接口)
**ElementType.**FIELD(成员变量)
**ElementType.**METHOD(方法)
**ElementType.**CONSTRUCTOR(构造器)
**ElementType.**PARAMETER(参数)
**ElementType.**LOCAL_VARAIBLE(局部变量)
java
@Target({ElementType.TYPE, ElementType.FIELD})
public @interface 注解名 { }
(2) @Retention // 描述注解生命周期
RetentionPolicy.SOURCE (注解存在于编码阶段,源码不存在)
RetentionPolicy.CLASS (注解存在于字节码阶段,运行不存在)
RetentionPolicy.RUNTIME (注解存在于所有阶段)
java
@Retention(RetentionPolicy.RUNTIME)
public @interface 注解名 { }
(3) @Documented // 使类内的注解可被抽取到API文档
(4) @Inherited // 描述类内注解会被子类继承
4 解析注解案例
4.1 定义注解
// @Target(TYPE,METHOD) 表示注解可作用于 类 和 方法
// @Retention(RUNTIME) 表示在所有阶段都生效
java
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnoF1 { String value(); }
4.2 使用注解
注释:为类注解设置"str1"值,为方法注解设置"str2"值
java
@AnnoF1("str1")
public class Test {
@AnnoF1("str2")
public void fn1() {...}
public void fn2() {...}
}
4.3 解析注解
(1) 获取实现类的字节码:Class<AnnoTest> c = AnnoTest.class;
(2) 获取注解1:AnnoF1 f1 = c.getAnnotation(AnnoF1.class); // 可获取包含父类继承来的注解标记(父类标记了(@Inherited))
(3) 获取注解2:AnnoF1 f2 = c.getDeclaredAnnotation(AnnoF1.class); // 获取本类注解
(4) 获取类全部注解1:Annotation\[\] fs = c.getAnnotations();
(5) 获取类全部注解2:Annotation\[\] fs = c.getDeclaredAnnotations();
java
public void readAnno() {
Class<Test> c = Test.class; // 获取含注解的类对象
AnnoF1 f1 = c.getAnnotation(AnnoF1.class); // 获取类注解
String val = f1.value(); // 获取类注解值
Method[] ms = c.getDeclaredMethods(); // 获取类所有公开方法
for (Method m : ms) { // 循环类所有公开方法
if (m.isAnnotationPresent(AnnoF1.class)) { // 判断方法是否有AnnoF1注解
AnnoF1 f2 = m.getAnnotation(AnnoF1.class); // 获取方法注解
String value2 = f2.value(); // 获取方法注解属性值
}
}
}