元注解:
注解的注解 [@Target、@Retention、@Documented、@Inherited。]
自定义注解 @interface 声明一个注解,[定义的]方法名 对应 [使用的]参数名,返回值类型对应参数类型 即定义的方法作为变量使用!
@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface LogAnnotation {
String module() default "";
}
1.Target 定义注解的使用位置,没有该项,表示注解可以用于任何地方
2.Retention 指明修饰的注解的生存周期,即会保留到哪个阶段。
SOURCE:源码级别保留,编译后即丢弃。
CLASS:编译级别保留,编译后的class文件中存在,在jvm运行时丢弃,这是默认值。
RUNTIME:运行级别保留,编译后的class文件中存在,在jvm运行时保留,可以被反射调用
3.Documented 可以被例如javadoc此类的工具文档化,只负责标记,没有成员取值
4.Inherited 标注一个父类的注解是否可以被子类继承,如果一个注解需要被其子类所继承,则在声明时直接使用@Inherited注解
1.自定义注解
@Target(ElementType.TYPE) 位置
@Retention(RetentionPolicy.RUNTIME) 周期
@Documented
//如果父类使用了HeritedApplication注解,则子类应该继承
@Inherited
@MyAnnoation
@interface HeritedApplication {
}
2.父类使用自定义注解
//父类使用了@HeritedApplication注解
@HeritedApplication
class Person {}
3.子类继承父类
class Student extends Person{}
4.main方法中判断子类是否继承自定义注解·
Class clazz = Student.class;
//Student类是否有@HeritedApplication
if(clazz.isAnnotationPresent(HeritedApplication.class)){
System.out.println("true");//true 因为@Inherited表明该注解可被子类继承
}
```