一、引言
平时大家用eclipse自动补全工具的时候,肯定在重写方法的时候遇到过 @Override 字样。然后我就心生疑问,这到底是什么,删除过后发现程序也能跑起来,似乎不影响程序本身,像是一红注释,然而,是注释的话为什么不直接注释好了,为什么多此一举呢?这就是今天主角--注解。
自jdk1.5之后引入注解和反射,它们就成为开发的一部分,广泛流行开来。有一部分人认为注解也应是反射的一
部分,没有反射,注解无法正常使用,但没有注解,反射依然正常使用。不过这些都不是重点。
二、注解释义:
注解(Annotation)也称元数据,描述数据的数据。它可以声明在包、类、字段、方法、局部变量等前面,用来
对这些元素进行说明。其作用有三:
1.编写:通过代码里标识的数据生成文档;
2.代码分析:通过代码里标识的数据对代码进行分析(使用反射)
3.编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查(Override)
三、注解的语法及分类:(jdk1.5版本)
annotation 的语法: @+annotation的类型
A:三种标准注解:
@Override:表示当前的方法定义将覆盖父类的方法;
@Deprecated:使用了注解为它的元素编译器将发出警告,因为注解 @Deprecated是不赞成使用
的代码,弃用。
@SuppressWarnings:关闭不当编译器警告信息
B:四种元注解(专门注解其它的注解):
@Docmented:注解是否包含在JavaDoc中
@Retention:什么级别保存该注解信息。可选RetentionPolicy参数
{
SOURCE: 注解将被编译器丢弃,编译后不再有任何意义( @Override,@SuppressWarnings都属于这类注解)
CLASS: 注解在class文件中可用,但被VM丢弃(注解默认方式)
RUNTIME: VM将在运行期间保留注解,因此可以通过反射机制读取注解的信息。
(自定义的注解通常使用这种方式)
}
@Target:注解用于什么地方。可选ElementType参数
{
CONSTRUCTOR: 构造器的申明
FIELD: 域声明 包括enum实例
LOCAL_VARIABLE: 局部变量声明
METHOD: 方法声明
PACKAGE: 包声明
PARAMETER: 参数声明
TYPE: 类、接口、注解类型、enum声明
}
@Inherited: 是否允许子类继承该注解
四、自定义注解编写
实例1
@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface Test { }
说明: 除了 @ 符号,注解很像是一个接口。定义注解的时候需要用到元注解。在注解中一般会有一些元素以表示某些值。注解的元素
看起来就像接口的方法,唯一的区别在于可以为其制定默认值没有元素的注解称为标记注解,上面的 @Test就是一个标记注解。
注解的可用的类型包括以下几种:所有基本类型、String、Class、enum、Annotation、以上类型的数组形式。元素不能有不确
定的值,即要么有默认值,要么在使用注解的时候提供元素的值。而且元素不能使用null作为默认值。注解在只有一个元素且该元素的
名称是value的情况下,在使用注解的时候可以省略“value=”,直接写需要的值即可。
实例2
//自定义注解@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface User{public String id();public String description() default "description";}
//使用上面注解public class Login_Token{@User(id=1,description = "give me your password!")public boolean PasswdValid(String passwd){boolea flag=true;...return flag;}@user(id=2)public String nextPasswd(String passwd){...}}
实例3:
//自定义注解@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME){public@interface cola{public enum Priority{LOW,HIGH}String author() deafault "jia";Priority priority() deafault Priority.LOW;}}//使用上述注解@cola(priority=cola.Priority.HIGH,author="cola")public void method(){...}
实例4
//注解中只有一个值,可以直接命名为“value”,使用时无需再标明属性名。@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface cola{String value();}//使用上述注解,参数省略"value="@cola("jia")public void method(){...}
以下完全copy 网络资源
五、注解用例
注解的功能很强大,Spring和Hebernate这些框架在日志和有效性中大量使用了注解功能。注解可以应用在使用标记接口的地方。不同的是标记接口用来定义完整的类,但你可以为单个的方法定义注释,例如是否将一个方法暴露为服务。
在最新的servlet3.0中引入了很多新的注解,尤其是和servlet安全相关的注解。
HandlesTypes –该注解用来表示一组传递给ServletContainerInitializer的应用类。
HttpConstraint – 该注解代表所有HTTP方法的应用请求的安全约束,和ServletSecurity注释中定义的HttpMethodConstraint安全约束不同。
HttpMethodConstraint – 指明不同类型请求的安全约束,和ServletSecurity 注解中描述HTTP协议方法类型的注释不同。
MultipartConfig –该注解标注在Servlet上面,表示该Servlet希望处理的请求的 MIME 类型是 multipart/form-data。
ServletSecurity 该注解标注在Servlet继承类上面,强制该HTTP协议请求遵循安全约束。
WebFilter – 该注解用来声明一个Server过滤器;
WebInitParam – 该注解用来声明Servlet或是过滤器的中的初始化参数,通常配合 @WebServlet 或者 @WebFilter 使用。
WebListener –该注解为Web应用程序上下文中不同类型的事件声明监听器。
WebServlet –该注解用来声明一个Servlet的配置。
ADF (应用程序框架)和注解
现在我们开始讨论文章的最后一部分了。应用程序框架,被称为ADF,由Oracle开发用来创建Oracle融合应用。我们已经了解了注解的优缺点,也知道如何编写自定义的注解,但我们应该将注解应用在ADF的哪部分呢?ADF是否提供了一些朴素的注解?很好的问题,确实在ADF中大量使用注解有一些限制。之前提到的应用框架如Spring和Hibernate使用AOP(面向侧面的程序设计)。在AOP中,框架提供了一种机制,在事件的预处理和后续处理中注入代码。例如:你有一个钩子用来在方法执行之前和之后添加代码,所以你可以在这些地方编写你的用户代码。ADF不使用AOP。如果我们有任何注解的用例可用,我们可能需要通过继承的方式实现。