Java注解简述
2015-10-21 15:13
405 查看
Java注解简述
国庆假期前后,基本是看一下开源的项目,发现不少优秀的开源项目都用了注解和动态代理相关的知识,所以顺带有好好地研读了一下注解和动态代理,加深了对注解和动态代理的认识。博客都差不多接近要断了,前一段七七八八地看了各种东西,一直都没有写东西,懒惰了很多。整的现在很多东西都没有做好,突然觉得不仅仅是专业学习,其他的各种东西也应该有点追求。力求生活精致。Java从JDK5开始引入了注解(Annotation),也称元数据,它可以用于创建文档,代码依赖性跟踪,甚至编译时的基本检查。注解基本格式是
@注解名称。经常遇到的一个例子如下:
@Override public String toString(){ return "annotation string"; }
Java注解可以应用到包,类,方法,字段,局部变量上面。另外Java可以通过反射去读取注解的内容。
Java内置注解
Java内置了三个注解,定义在java.lang包里面:- Override:重载检查
- Deprecated: 使用过时的代码的提示
- SuppressWarnings:提醒,像uncheck,serial等
这些个也都是我们经常使用的注解,特别是
Override,在继承的时候加上注解,能够对继承进行检查。像本文第一段代码就是使用了Override。下面这段就是Override的源码:
package java.lang; import java.lang.annotation.*; @Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { }
自定义注解
Java出了内置了注解,也同样是允许自定义注解的。自定义注解也跟Override的实现完全一样。比如说我们想要实现一个Hello注解,只需要使用如下代码:package java.lang; import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) public @interface Hello { String haha() default "ha"; String haha1() default "ha1"; }
这样就可以像使用Override一样使用Hello注解了。其中
@interface是声明一个注解,自动继承了java.lang.annotation.Annotation接口,编译器程序会完成其他部分,在定义注解时,不能继承其他注解或接口。
@Retention是用来设置作用范围,默认时RetentionPolicy.CLASS,它也是一种保留范围,CLASS保留在class文件中,但VM运行时不保存,RUNTIME保留在class,运行时可以反射读取注解的值。
@Target是用来指定适用的元素种类。如果不添加的话,任何元素都能够使用。注解里面的方法是注解的变量,可以设置默认值,类型基本变量都可以。
读取注解的值
注解的值可以在运行的时候读取出来,只要@Retention设置为RUNTIME就能够被读取出来了。不过读取出来的具体方法就需要去了解下了。
比如我们使用之前定义的Hello注解
@Hello class TestHello{ @Hello(haha="haha") public void sayHello(){} @Hello(haha="hahastr") public void hello; }
类注解
Class<TestHello> cl = TestHello.class Hello h = cl.getAnnotation(Hello.class); System.out.println(h.haha()+","+h.haha1());
函数注解
Class<TestHello> cl = TestHello.class Method method = cl.getMethod("sayHello",new Class[0]); Hello h = (Hello)method.getAnnotation(Hello.class);
字段,构造函数的使用方式都是一样的。程序可以在运行的时候读取注解
处理注解的工具APT
APT(Annotation Processing Tool)就是jdk在1.5提供的帮助注解处理过程的工具。它的作用是在编译源文件之前,通过一个自定义的注释处理器去解释并处理源文件的注释,并且由注释处理器生成一些新的源文件,字节码文件,或其他文本文件。APT也会对新的源文件进行处理,知道没有新的源文件产生。使用了注解的一些工具
现在很多开源第三方Android项目都是使用了注解,像依赖注入库Dagger就是使用了很多注解去实现注入,并且利用注解处理工具在编译时生成辅助类,在运行时完成注入。
另外又比如ButterKnife,也是一种依靠注入的开源库,不过ButterKnife是Android中通过id自动绑定java中的View变量与layout中描述的View的一个开源库。
以及我前面看过的Retrofit,那是一个将Http访问简化成与ORM一样的开源库。很多第三方库都使用注解来方便开发者使用,但是其中的原理还是应该了解一下。
Spring中用到的注解就更多了,以及很多ORM都是用注解方便开发。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统