java annotation心得

来源:互联网 发布:淘宝图片尺寸和像素 编辑:程序博客网 时间:2024/06/17 01:19

注解(也被称为元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们在稍后的某个时刻非常方便地使用这些数据。

注解在一定程度上是把元数据与源代码文件结合在一起,而不是保存在外部文档这一趋势之下催生的。


以上摘自THINK IN JAVA,在我看来,注解是一种特殊的注释,一般的注释只有提示的功能,我们在程序中无法使用到这部分数据,当然如果非要使用,可以自己写的程序分析源文件,然后找到注释然后做相应的处理。而注解的出现就为我们提供了一种机制,使得我们按照相应的规则编写完注解,就能通过java特定的接口来获得到这部分数据。这样,在某些情形下,不仅会使代码更优雅,也会减少大量重复工作。

使用注解需要两个步骤:

  1 编写注解

示例如下:

import java.lang.annotation.*;

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

public @interface UseCase{

public String description() default "no description";

}

注解的定义看起来很像接口的定义,事实上与其它任何Java接口一样,注解也将会编译成class文件。

@Target与@Retention为元注解,java目前内置了四种元注解,元注解用来注解其它的注解,即用来定义其它的注解。下面来介绍下四种元注解


@Target              表示该注解可以用于什么地方。包含CONSTRUCTOR,FIELD,LOCAL_VARIABLE..........示例的METHOD表示该注解作用于一个方法

@Retention      表示需要在什么级别保存该注解信息。 可选参数 SOURCE,CLASS,RUNTIME                   示例的RUNTIME表示VM将在运行期间也保留注解,因此     可以通过反射机制读取注解,如果SOURCE则需要 com.sun.mirror中的工具从源码中获取信息

@Documented 将此注解包含在javadoc中。

@Inherited         允许子类继承父类的注解

至于注解方法就是为了在读取注解时,获取其中的属性。default表示如果没有给这个属性赋值,则取默认值。比如

在一个方法前加上注解 

@UseCase(description="text des")

public void test(){

}

之后通过反射得到UseCase实例时,就能通过description()方法获得到这个属性。

2 编写注解处理器

使用注解必须要有注解处理器,即你在注解中提供了信息,则必须要自己对这些信息进行处理。当然java中内置了三种注解,不用我们来写注解处理器,那是因为java已经实现了相应的处理器

JAVA目前内置了三种注解:

@Override,表示当前的方法定义将覆盖超类中的方法。如果在重写时,写错方法签名,将会与编译器发出错误提示。

@Deprecated,如果使用了注解为它的元素,编译器会发出错误提示。

@SuppressWarnings,关闭不当的编译器警告信息。

这些内置的注解只提供了一般的功能,而要真正发挥注解的作用,则需要我们自己添加新的注解。

实现示例处理器

import java.lang.reflect.*;

public class UseCaseProcesser{

public static void process(class<?> cl){                                              //参数为方法中加上相应注解的类

for(Method m: cl.getDeclaredMethods()){

UseCase uc=m.getAnnotation(UseCase.class);

if(uc!=null)

System.out.println("the description is '+uc.description());               //这里就获得了添加在注解中的信息

}

}

}

以上就是注解的整个使用流程,为了演示简单,只是把注解中放入的东西取出来并显示,当然注解可以做的远不止如此。但从这个例子可以看出注解的本质,就是提供了一种在程序中使用注释中的数据的机制,它只是给了我们一个工具,至于如何使用则有无限可能。THINK IN JAVA上提到了一种使用情况,就是在使用javabean的时候.我们用javabean时都是定义一个类型的各个属性及相应的set,get方法,如果这个bean要存数据库呢,我们就需要为各个javabean各自写不同的建表语句,所有的工作都要由我们重复完成,而使用annotation就可以解决这个问题,具体方法大致如下: 1 在javabean的类中加上各自属性的注释,注释包含属性在数据库中的名称,类型,主码与否,是否为空等 2编写annotation处理器,自动生成相应的SQL语句,然后生成数据库中的表。

鄙人浅见,望各位指正。。

0 0
原创粉丝点击