一、注解好处:
使代码简洁、清晰。
二、注解分类:
1)源码注解
只存在于源码中
2)编译时注解
注解在源码以及.class文件都存在,例如 @Override
3)运行时注解
在运行时还存在,甚至改变程序运行逻辑,Spring@Autowride等框架注解、自定义注解等
三、自定义注解:
//注解作用范围
@Target({ElementType.METHOD, ElementType.TYPE})
//注解存活周期
@Retention(RetentionPolicy.RUNTIME)
//父类注解是否可以被子类继承(注意接口注解不可以被继承)
@Inherited
//是否生产JavaDoc
@Documented
public @interface Description {
//成员类型可以为基本类型、String、Class、Annotation、枚举
//成员无参数不能抛出异常
//注解只有一个成员,成员名使用Value(),使用时可以忽略成员名与= (例如String Value();-->使用@Description("value1"))
String desc();
int age() default 0;
}
@Description(desc = "Father Class")
public class Father {
@Description(desc = "Father say methodF")
public void say(){
System.out.println("Father Say..");
}
}
//子类不声明注解时,子类会继承父类的desc注解值,当子类声明注解时会使用子类注解值
@Description(desc = "Children Class")
public class Children extends Father {
@Override
//方法注解不会被继承
@Description(desc = "Children say method")
public void say() {
System.out.println("Children say... ");
}
}
public class ParseAnn {
public static void main(String[] args) {
try {
//1.使用类加载器加载类
Class c = Class.forName("com.bruce.anno.test.Children");
//2.获取类上的注解 判断类上是否存在Description注解
boolean isExist = c.isAnnotationPresent(Description.class);
if (isExist) {
//3.拿到类上的注解实例,获取注解值
Description d = (Description) c.getAnnotation(Description.class);
System.out.println(d.desc());
}
//4.解析方法上的注解1
Method[] methods = c.getMethods();
for (Method method : methods) {
boolean isMeExist = method.isAnnotationPresent(Description.class);
if (isMeExist) {
Description d = method.getAnnotation(Description.class);
System.out.println(d.desc());
}
}
//5.解析方法上的注解2
for (Method method : methods) {
Annotation[] annotations = method.getDeclaredAnnotations();
for (Annotation annotation : annotations) {
if (annotation instanceof Description) {
Description d = (Description) annotation;
System.out.println(d.desc());
}
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}