1 在定义注解时我们会用到该注解:
@Retention(RetentionPolicy.RUNTIME)它有以下三个选项来说明它的生存周期。 2 /** 3 SOURCE级别表示代码级别可见,经过编译器编译生成字节码对象时,此注解就没了。 4 * 比如@override就是代码级别可见 5 */ 6 SOURCE, 7 8 /* 9 * CLASS表示字节码对象级别可见,但是字节码对象被虚拟机加载时, 10 * 这个注解会被抛弃,这是默认的可见级别 11 */ 12 CLASS, 13 14 /** 15 16 * RUNTIME表示运行时也可见,当虚拟机加载字节码对象时,此注解仍然可见。 17 * 因此可以通过反射获取注解信息,然后完成相应的注解解析工作,一般自定义的注解都是运行时可见。 18 */ 19 RUNTIME 20 21 /*现在我们定义一个注解*/ 22 23 import java.lang.annotation.ElementType; 24 import java.lang.annotation.Retention; 25 import java.lang.annotation.RetentionPolicy; 26 import java.lang.annotation.Target; 27 /*用来设置注解可以加到哪里*/ 28 @Target(ElementType.METHOD) 29 /*用来确定注解的生命周期*/ 30 @Retention(RetentionPolicy.RUNTIME) 31 public @interface TestAnnotationString { 32 String name() ; 33 String email() default "tjs"; 34 }
接下来我们创建使用该注解的类
1 public class TestAnnotation { 2 3 @TestAnnotationString(name="tjs") 4 public void out(){ 5 System.out.println("tjs"); 6 } 7 }
接下来我们来获取某个类的方法或字段有几个设置该注解
import java.lang.reflect.Field; import java.lang.reflect.Method; public class TestAnnotationMain { public static void main(String[] args){ TestAnnotationMain util=new TestAnnotationMain(); util.getInfomation(TestAnnotation.class); } /* *这个方法用于注解的解析,其输入是Class类型的对象。通过反射这个Class对象获取相关的注解,进行注解的解析 */ public void getInfomation(Class<?>clazz){ //因为注解是在成员方法上,因此需要获得类的所有方法信息 Method[] Methods = clazz.getMethods(); //如果注解是在成员字段上,因此需要获得类的所有字段信息 Field[] filed22 = clazz.getFields(); for (Method field : Methods) { //判断这个字段上是否有相应的注解信息(FruitName.class) if (field.isAnnotationPresent(TestAnnotationString.class)) { TestAnnotationString tjs = field.getAnnotation(TestAnnotationString.class); System.out.println("注释"+field.getName()+" " +tjs.name()); } } } }
通过自定义注解还可以配合SpringMVC来判断加某个注解的方法访问不需要登录,以及日志的的记录。
本文参考自:https://blog.csdn.net/andyzhu_2005/article/details/81355399