java注解的理解和实例

页面导航:首页 > 软件编程 > Java编程 > java注解的理解和实例

java注解的理解和实例

来源: 作者: 时间:2016-01-21 09:39 【

一、引言 平时大家用eclipse自动补全工具的时候,肯定在重写方法的时候遇到过 @Override 字样。然后我就心生疑问,这到底是什么,删除过后发现程序也能跑起来,似乎不影响程序本身,
一、引言
 
   平时大家用eclipse自动补全工具的时候,肯定在重写方法的时候遇到过 @Override 字样。然后我就心生疑问,这到底是什么,删除过后发现程序也能跑起来,似乎不影响程序本身,像是一红注释,然而,是注释的话为什么不直接注释好了,为什么多此一举呢?这就是今天主角--注解。
   自jdk1.5之后引入注解和反射,它们就成为开发的一部分,广泛流行开来。有一部分人认为注解也应是反射的一
部分,没有反射,注解无法正常使用,但没有注解,反射依然正常使用。不过这些都不是重点。
 
二、注解释义:
 
   注解(Annotation)也称元数据,描述数据的数据。它可以声明在包、类、字段、方法、局部变量等前面,用来
对这些元素进行说明。其作用有三:
    1.编写:通过代码里标识的数据生成文档;
2.代码分析:通过代码里标识的数据对代码进行分析(使用反射)
3.编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查(Override)
 
三、注解的语法及分类:(jdk1.5版本)
 
annotation 的语法: @+annotation的类型 
A:三种标准注解:
@Override:表示当前的方法定义将覆盖父类的方法;
@Deprecated:使用了注解为它的元素编译器将发出警告,因为注解 @Deprecated是不赞成使用
    的代码,弃用。
@SuppressWarnings:关闭不当编译器警告信息
 
B:四种元注解(专门注解其它的注解):
@Docmented:注解是否包含在Doc中
@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){
[email protected] 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融合应用。我们已经了解了注解的优缺点,也知道如何编写自定义的注解,但我们应该将注解应用在ADF的哪部分呢?ADF是否提供了一些朴素的注解?很好的问题,确实在ADF中大量使用注解有一些限制。之前提到的应用框架如Spring和Hibernate使用AOP(面向侧面的程序设计)。在AOP中,框架提供了一种机制,在事件的预处理和后续处理中注入代码。例如:你有一个钩子用来在方法执行之前和之后添加代码,所以你可以在这些地方编写你的用户代码。ADF不使用AOP。如果我们有任何注解的用例可用,我们可能需要通过继承的方式实现。
Tags:

文章评论

最 近 更 新
热 点 排 行
Js与CSS工具
代码转换工具

<