申明自定义注解需要用元注解指定注解的范围,使用到的两个元注解:
@Retention
@Retention(RetentionPolicy.SOURCE) 注解仅存在于源码中,在class字节码文件中不包含
@Retention(RetentionPolicy.CLASS),默认的,注解在class字节码文件中存在,运行时无法获得
@Retention(RetentionPolicy.RUNTIME),注解在class字节码文件中存在,在运行时通过反射获得
@Target
@Target(ElementType.TYPE) 作用接口、类、枚举、注解
@Target(ElementType.FIELD) 作用属性字段、枚举的常量
@Target(ElementType.METHOD) 作用方法
@Target(ElementType.PARAMETER) 作用方法参数
@Target(ElementType.CONSTRUCTOR) 作用构造函数
@Target(ElementType.LOCAL_VARIABLE)作用局部变量
@Target(ElementType.ANNOTATION_TYPE)作用于注解
@Target(ElementType.PACKAGE) 作用于包
@Target(ElementType.TYPE_PARAMETER) 作用于类型泛型
@Target(ElementType.TYPE_USE) 类型使用.可以用于标注任意类型除了 class
新建自定义注解:
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyAnnotation { public String name(); public String[] address(); }
使用自定义注解并解析:
通过反射获取到使用该注解的方法,进而获得该注解中的值
public class MyAnnotationTest { @MyAnnotation(name="张三",address = {"湖北省","武汉市"}) public String getUser(){ return ""; } public static void main(String[] args) throws NoSuchMethodException { Class c = MyAnnotationTest.class; Method m = c.getMethod("getUser",null); if(m!=null){ //判断方法是否有某个注解 if(m.isAnnotationPresent(MyAnnotation.class)){ //获得注解对象 MyAnnotation myAnnotation = m.getAnnotation(MyAnnotation.class); System.out.println(myAnnotation.name()); Stream.of(myAnnotation.address()).forEach(a->{ System.out.println(a); }); } } } }