一、引言

   平时大家用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。如果我们有任何注解的用例可用,我们可能需要通过继承的方式实现。