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;....
二、概念以及作用
- 概念:能够添加到Java源代码的语法元数据。类,方法,变量,参数,包都可以被注解,可以用来将信息元数据与程序元素进行关联。
- 作用:
- 标记,告诉编译器一些信息。
- 编译时动态处理,如动态生成代码
- 运行时动态处理,如得到注解信息
三、分类
- 标准Annotation:Java自带的几个Annotation
- Override 重写方法
- Deprecated 不鼓励使用(有更好方式,存在风险,不在维护)
- SuppressWarnings 忽略某项Warning
- 元Annotation 用来定义Annotation的Annotation
- @Rerention 保留时间,可选SOURCE(源码时) CLASS(编译时) RUNTIME(运行时)默认CLASS,SOURCE 大都为Mark Annotation(下面会说)这类Annotation大都用来校验,比如Override
- @Target 可以用来修饰哪些程序元素,如TYPE,METHOD,CONSTRUCTOR,PARAMETER等 为标注为可修饰全部
- @Inherited 是否可以被继承 默认false
- @Documented 是否会保存到JavaDoc中
- 自定义Annotation 自己根据需要定义的Annotation定义时需要用上面的元Annotation
四、自定义Annotation
- 定义
@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解析
- 运行时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
- 【Java】【Annotation】Java Annotation (注解)
- JAVA Annotation 注解
- JAVA 注解(annotation)
- Java Annotation(注解)
- 11.Java注解(Annotation)
- java注解(Annotation)
- java注解Annotation
- java 注解(Annotation)
- Java注解Annotation
- Java Annotation 注解
- JAVA注解 Annotation
- Java注解Annotation详解
- Java注解Annotation详解
- java 注解Annotation
- java Annotation 注解
- java 注解(annotation)
- Java 注解(Annotation)
- JAVA 注解(Annotation)
- 如何打一手好Log
- 16. 3Sum Closest
- 关于对象运行时方法匹配的问题
- hdoj 题目
- 排序算法二:简单选择排序
- Java 注解-Annotation
- 当自增/减(++/--)遇上多线程
- 如何利用SQL注入进行爆库
- 利用GPIO的命令控制树梅派的GPIO
- VS2013+QT5简单使用
- 基本数据类型(二)
- Java之属性封装
- 数据结构实验之串一:KMP简单应用
- hive 2.1.0安装