之前实习参与一个创新性的框架的开发工作,之前就有要开发一个框架的想法但是却一直没有付诸行动,这个项目也暴漏出了自己很多的不足,其中注解就是我一个很大的盲点,记得第一次使用注解是在使用Juint测试框架的时候使用@Test注解编写测试代码,当时就感觉好高端,竟然可以脱离main函数运行程序,之后使用Spring MVC中的各种注解像@Controller、@AutoWire、@RequestMapping、@RequestBody等注解的功能是相当好用省去了配置XML的麻烦。虽然使用过很多注解但是对注解的实现原理还是两眼一抹黑。所以现在正好利用这个机会一要探注解的奥妙。
注解是在java 1.5中添加的新特性,是对来自像C#之类的语言对Java语言特性压力所做出的一种回应。注解在<<Think in Java>>中的定义是:注解(也被成为元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便的使用这些数据。
那么我们来看一下在开发中使用注解的好处:
1,注解可以用来生成描述符文件,甚至或是新类的定义,并且有助于减轻编写“板代码”的负担。
2,更加干净易读的代码以及编译期类型检查。
那么我们经常见到的Java中遇到的注解都有哪些呢?Java5中内置了三种注解,在java.lang包下:
1,@Override,表示覆盖或者实现超类中的方法。如果方法签名和超类中的不一样怎会提示错误。
2,@Deprecated 如果程序员使用了注解为它的元素,那么编译器会发出警告信息。
3,@SuppressWarnings 关闭不当的编译器警告信息。
另外还有四类注解用于新注解的创建。
@Target表示注解可以用在什么地方,
其中可能的ElementType参数有
1、CONSTRUCTOR:作用于构造器
2、FIELD:作用于域(包括enum实例)
3、LOCAL_VARIABLE:作用于局部变量
4、METHOD:作用于方法声明
5、PACKAGE:作用于包
6、PARAMETER:作用于参数
7、TYPE:作用于类、接口(包括注解类型)或者enmu声明
@Retention表示需要在什么级别保存该注解信息。可选的RetentionPolicy参数包括
1、SOURCE:注解在代码层面,在编译时向北抛弃
2、CLASS:注解在class文件层面,但是会被JVM所抛弃。
3、RUNTIME:JVM将在运行期间保留注解,因此可以通过反射机制读取注解的信息。
@Document标识将注解包含在Javadoc中
@Inherited表示允许子类继承父类中的注解
下面举出一个定义注解的例子,确实有点像定义接口不过这里在interface前面多了一个@
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoTrigger {
public int id();
public String description() default "no description";
}
注解的使用会涉及到注解的扫描,记得在使用Spring的时候会经常配置要扫描的路径,在扫描的时候必然会涉及到一些反射的知识,典型的例子就是Spring MVC在框架中用到了@RequestMapping,而且被RequestMapping所修饰的方法还需有方法参数的自动赋值,我当时就对这两块进行了着重的研究并自己实现了类似的功能,流程无外乎先把源代码中的添加注释的类,方法扫描出来并存储在Map中,请求路径为Key,方法Method实例作为值 ,当HTTP请求过来以后对请求进行解析,然后在Map中找到对应的Method,然后根据请求的参数对此方法中的参数进行赋值,最后进行invoke,不过里面的处理细节会更加复杂一些。当时使用了javasist来对参数名进行获取。将注解添加进自己的项目中会大大的减少系统中的冗余代码,用过之后就会发现还是瞒酷的。