大纲:
- 自定义注解
- 从注解上获取值
一、自定义注解
@Target({ElementType.TYPE,ElementType.FIELD}) //注解作用在哪里,这里是类上和变量上 @Retention(RetentionPolicy.RUNTIME) //注解生命周期,这里是运行时 @Inherited //注解的子类和动态代理类也会拥有这个注解 public @interface MyAnn { //默认值value,这个属性名比较特殊@MyAnn("xxx"),这里xxx就是这个value String value(); //注解值有很多(可以是数组,枚举或者其他注解等),还可以设置默认值 int age() default 0; String[] parentsName() default {}; }
二、从注解上获取值
例子中使用到我们上面我们自定义的注解
@MyAnn(value = "haha",age = 3,parentsName = {"zhangsan","lisi"}) public class Client { @MyAnn(value = "hehe",age = 5,parentsName = {"wangwu","zhaoliu"}) private static String name; public static void main(String[] args) throws NoSuchFieldException { //获取类上的注解 final Class<Client> clazz = Client.class; final MyAnn annotationClass = clazz.getAnnotation(MyAnn.class); System.out.println(annotationClass.age());//3 System.out.println(Arrays.toString(annotationClass.parentsName()));//[zhangsan, lisi] System.out.println(annotationClass.value());//haha //获取成员变量上的注解 final Field name = clazz.getDeclaredField("name"); final MyAnn annotationField = name.getAnnotation(MyAnn.class); System.out.println(annotationField.age());//5 System.out.println(Arrays.toString(annotationField.parentsName()));//[wangwu, zhaoliu] System.out.println(annotationField.value());//hehe } }
上例中通过反射拿到class和field,然后获取注解。
注:注解还可以定义到其他地方,取值的方式和上例类似。