Java 注解-Annotation

来源:互联网 发布:手机照片怎么导入mac 编辑:程序博客网 时间:2024/06/07 10:20

Java 注解-Annotation

## 学习笔记


一、使用

@Overridepublic void onCreate(...){...}@GET("api/getuser/{username}")User getUser(@Path("username") String username);@BindView(R.id.btn_getuser)Button getUser;....

二、概念以及作用

  1. 概念:能够添加到Java源代码的语法元数据。类,方法,变量,参数,包都可以被注解,可以用来将信息元数据与程序元素进行关联。
  2. 作用:
    • 标记,告诉编译器一些信息。
    • 编译时动态处理,如动态生成代码
    • 运行时动态处理,如得到注解信息

三、分类

  1. 标准Annotation:Java自带的几个Annotation
    • Override 重写方法
    • Deprecated 不鼓励使用(有更好方式,存在风险,不在维护)
    • SuppressWarnings 忽略某项Warning
  2. 元Annotation 用来定义Annotation的Annotation
    • @Rerention 保留时间,可选SOURCE(源码时) CLASS(编译时) RUNTIME(运行时)默认CLASS,SOURCE 大都为Mark Annotation(下面会说)这类Annotation大都用来校验,比如Override
    • @Target 可以用来修饰哪些程序元素,如TYPE,METHOD,CONSTRUCTOR,PARAMETER等 为标注为可修饰全部
    • @Inherited 是否可以被继承 默认false
    • @Documented 是否会保存到JavaDoc中
  3. 自定义Annotation 自己根据需要定义的Annotation定义时需要用上面的元Annotation

四、自定义Annotation

  1. 定义
@Ducumented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)@Inheritedpublic  @Interface MethodInfo{    String title() default "gaop";    String date();    String content();}
  • 通过@interface定义
  • 注解配置参数名为注解类的方法名
  • 所有方法没有方法体 没有参数和修饰符 默认public
  • 方法返回值只有基本类型,String,Class,annotation,enumeration或者它们的一维数组
  • 一个属性都没有表示该 Annotation 为 Mark Annotation
  • 可以用default表示默认值

2.使用

public class Test{   @MethodInfo(title = "123",               date = "20160912",               content = "4567")    public Notice getNotice(){         return new Notice();    }}

五、 Annotation解析

  1. 运行时Annotation解析(@Retention为RUNTIME)
    可以用过以下方法:
    • method/field/class.getAnnotations(); 得到该Target某个Annotation的信息
    • method/field/class.getAnnotation(AnnotationName.class); 表示得到该Target所有Annotation
    • method/field/class.isAnnotationPresent(AnnotationName.class); 表示该Target是否被某个Annotation修饰

实例

try {            Class cls=Class.forName("com.gaop.aidl.Test");            for(Method method:cls.getMethods()){                MethodInfo methodInfo=method.getAnnotation(MethodInfo.class);                if(methodInfo!=null){                    Log.i(TAG,method.getName());                    Log.i(TAG,methodInfo.title());                    Log.i(TAG,methodInfo.date());                    Log.i(TAG,methodInfo.content());                }            }        } catch (ClassNotFoundException e) {            e.printStackTrace();        }

2.编译时Annotation解析(@Retention为CLASS)
这部分编译器会自动解析,不过我们需要定义一个类继承自AbstractProcessor并重写process方法。编译器就会在编译时自动查找所有继承自AbstractProcessor的类,然后调用它们的process方法处理。

实例:

//表示要处理的Annotation名称@SupportedAnnotationTypes({ "com.gaop.java.MethodInfo" })public class MethodInfoProcessor extends AbstractProcessor {   // annotations-待处理的Annotations   // env-运行环境    @Override    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment env) {        HashMap<String, String> map = new HashMap<String, String>();        for (TypeElement te : annotations) {            for (Element element : env.getElementsAnnotatedWith(te)) {                MethodInfo methodInfo = element.getAnnotation(MethodInfo.class);                map.put(element.getEnclosingElement().toString(), methodInfo.author());            }        }        //表示这组annotation是否被这个Processor接受,如果接受后续的processor不会再对这个Annotations进行处理        return false;    }}
0 0
原创粉丝点击