- 注解简介
- 注解使用
注解简介
注解java扩展标记一种形式,可以丰富java语言的多功能特性,可以使用注解来标记我们的类、属性、方法、构造函数等等。
java 保护 4中元注解,分别是 Documented、Inherited、Retention、Target
@Documented:
这个元注解表示注解可以文档化,什么意思,举个列子
@Documented //被标记的类可以文档化 @Inherited //注解可以继承 @Retention(RetentionPolicy.RUNTIME)//注解被jvm保留,反射可以拿到本注解的信息 @Target({ElementType.FIELD,ElementType.METHOD,ElementType.TYPE}) public @interface AnnotationBean { /** * 是否需要打印日志 */ boolean needLog() default false; }
@AnnotationBean(needLog = true) public class AnnotationTest {}
此时这个类可以被文档化,我们通过javadoc 命令来为我们生成文档
构建成功后生成的信息,打开index.html 可以看到被标记的Annotation 类生成了文档(一般这元注解很少用到)
@Inherited
这个注解的作用是可以注解可继承,什么意思
public class AnnotationTest1 extends AnnotationTest { public static void main(String[] args) throws ClassNotFoundException { Class c = Class.forName("main.test.annotationTest.AnnotationTest1"); Annotation [] annotations = c.getAnnotations(); System.out.println(annotations.length); } }
刚刚我们在AnnotationTest类上标记了我们写的注解,如果把AnnotationBean 上的@Inherited去掉,就继承不到这个注解了
@Retention(SOURCE、CLASS、RUNTIME)
SOURCE:是编译时就被丢弃,也就是不会保存在class文件中(一般就是在编译的时候做点小动作,比如我们常用的@SuppressWarnings诛注解,这个注解是在编译的时候拟制警告)
CLASS:编译的时候保存在class 文件中,但是jvm加载class文件的时候不会读取注解(具体作用不明,但是可以用这个注解来注释类文件,应为这个注解没有被编译成而进制文件)
RUNTIME:编译的时候保存在class 文件中,但是jvm加载class文件的时候不会读取注解(其实注解被编译成了二进制,因为类加载其只会加载二进制数据,这个注解是我们最常用的注解,因为我们可以通过反射机制来读取注解来扩展项目功能)
最后举RUNTIME列子
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException { Class c = Class.forName("main.test.annotationTest.AnnotationTest"); Field [] fields = c.getDeclaredFields(); for(Field field: fields){ field.setAccessible(true); Annotation [] annotations = field.getDeclaredAnnotations(); for(Annotation annotation : annotations){ if(annotation instanceof AnnotationBean){ //打印日志 if(((AnnotationBean) annotation).needLog()){ c.getMethod("set"+field.getName().substring(0,1).toUpperCase()+field.getName().substring(1),String.class).invoke(c.newInstance(),"我在测试"); } } } } }