Java Annotation
2017-05-07 本文已影响8人
tiang
Java annotation
以我的理解,Java的注解就是对代码的注释,但是与普通注释不同的是,这些注释可以自定义规范,有些甚至可以在运行时保留并通过反射获取。既然是注释,那么无论保存时间有多长,对程序的运行结果都没有任何影响。注释存在的根本意义就是对代码的说明解释,诸如这段代码要干嘛,这个类是做什么的之类。
根据以上理解,可以总结出注解的几种用途。首先是作为注释存在的意义就是对程序的说明,理所当然可以根据注解生成一份产品说明文档,以供后来者理解你的程序和代码。其次是注解比注释更进步的一点是程序可以在运行时通过反射获取注解的内容。那么我们完全可以把一部分需要在配置文件中定义的内容放在注解里面实现。比如一个web项目,需要根据http请求的地址不同调用不同的servlet进行响应,这样一种<地址,servlet>的映射关系,完全可以通过在servlet类上添加注解来实现。(但是注解无法完全取代配置文件,强行使用可能会自找麻烦)。第三种我是在网上看到的,就是给编译器一个信号,例如@Override注解,编译器检查到这种注解,就会检查该函数是否是重载的父类函数,如果不是就报错。
注解有几个特性
- 注解不支持相互继承。实际上所有的注解编译之后都会实现Annotation接口
- 注解支持的数据类型只有String、基本数据类型、枚举类型、类类型、注解类型以及他们的数组。
ORM
Object Relational Mapping 对象关系映射。顾名思义就是数据库表与类的映射关系。最简单的一种就是类对应表,成员变量对应列,一个对象对应一行数据。这样的形式完全可以用注解来实现。
例子
- 定义一个数据库表的注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
public String value() default "";
}
- 定义一个数据库表列的注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
public String value() default "";
}
- 定义一个类,加上注解,与之对应的数据库表
@Table("UserInfo")
public class User {
@Column("username")
public String userName;
@Column("password")
public String password;
@Column("age")
public int age;
}
- 获取类对应的表,以及成员变量对应的列
boolean isTable = User.class.isAnnotationPresent(Table.class);
if (isTable) {
Table table = User.class.getAnnotation(Table.class);
System.out.println(User.class.getSimpleName() + ": " + table.value());
Field[] fields = User.class.getFields();
for (Field field : fields) {
boolean isCol = field.isAnnotationPresent(Column.class);
if (isCol) {
Column col = field.getAnnotation(Column.class);
System.out.println("\t" + field.getName() + ": " + col.value());
}
}
-
输出结果
1.png