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语句,然后生成数据库中的表。
鄙人浅见,望各位指正。。
- java annotation心得
- JAVA Annotation & 自定义Annotation
- java Annotation Annotation elements
- Java Annotation
- Java Annotation
- Java Annotation
- Java Annotation
- Java Annotation
- java annotation
- Java Annotation
- Java Annotation
- Java Annotation
- Java Annotation
- JAVA [ Annotation]
- Java Annotation
- java annotation
- Java annotation
- Java Annotation
- Java封装读取E文件(txt),将一行转换为数组
- Ruby中访问控制符public,private,protected区别总结
- 03hibernate Annotation版本的hibernate
- 计算机网络(自顶向下方法)学习笔记 1.7 计算机网络和因特网的历史
- 只是刚开始!
- java annotation心得
- precision recall曲线Matlab实现
- Eclipse字体和颜色设置
- 24点 c++
- Hadoop Map&Reduce个数优化设置以及JVM重用
- LCD开发之汉字显示
- Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'的解决
- UIBezierPath贝塞尔弧线常用方法记
- OCP 1Z0 052 188