一:定义:注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
二:分类:
1)按照运行机制分为:源码注解,编译时注解,运行时注解
2)按照来源分为:JDK注解,第三方注解,自定义注解
3)元注解:注释的注释
三:具体注释
1.JDK注解
1)@Override表示当前的方法覆盖父类的方法
2)@Deprecated表示方法已经过时,方法上有横线,使用时会有警告
3)@SuppressWarning表示关闭一些警告信息
2.自定义注解
@Target({ElementType.METHOD, ElementType.TYPE}) //表示注解的作用域(元注解)
@Retention(RetentionPolicy.RUNTIME) //生命周期(元注解)
@Inherited //标识性元注解,允许子类继承
@Documented //元注解,生成javadoc时会包含注解
public @interface Description {
String value();
int age() default 18; //可以使用default为成员指定默认值
}
补充:
(1)成员类型是受限的,合法的类型包括原始类型以及String、Class、Annotation、Enumeration
(2)如果注解只有一个成员,并且把成员取名为value(),则在使用时可以忽略成员名和赋值号“=”
(3)注解类可以没有成员,没有成员的注解称为标识注解
(4)作用域参数:
ElemenetType.CONSTRUCTOR(构造方法声明)
ElemenetType.FIELD(字段生声明)
ElemenetType.LOCAL_VARIABLE(局部变量声明)
ElemenetType.METHOD (方法声明)
ElemenetType.PACKAGE (包声明)
ElemenetType.PARAMETER (参数声明)
ElemenetType.TYPE(类,接口声明)
(5)生命周期参数:
RetentionPolicy.SOURCE(只在源码显示,编译时会丢失)
RetentionPolicy.CLASS(编译时会记录到class中,运行时忽略)
RetentionPolicy.RUNTIME( 运行时存在)
3.使用注解的语法
@<注解名>(成员名=成员值,。。。)
4 .解析注释
public class ParseAnn {
public static void main(String[] args) {
try {
//1使用类加载器加载类
Class child = Class.forName("com.ann.test.Child");
//2找到类上面的注解
boolean isExist = child.isAnnotationPresent(Description.class);
if(isExist){
//3拿到注解实例
Description d = (Description)child.getAnnotation(Description.class);
System.out.println(d.value());
}
//4找到方法上的注解
Method[] ms = child.getMethods();
for (Method method : ms) {
boolean isMExist = method.isAnnotationPresent(Description.class);
if(isMExist){
Description d = (Description)method.getAnnotation(Description.class);
System.out.println(d.value());
}
}
} catch (ClassNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
要解析的类和运行结果: