1.什么是注解
注解(Annotation),也叫元数据(描述数据的数据)。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
2. 注解的作用
编写文档:通过代码里标识的元数据生成文档。
代码分析:通过代码里标识的元数据对代码进行分析。
编译检查:通过代码里标识的元数据让编译器能实现基本的编译检查
3.注解的分类
注解大致可以分为两类:
- JDK自带注解
- 自定义注解
JDK 8 自带注解一共有四种:
@Override:表示当前的方法定义将覆盖父类的方法。
@Deprecated:若某类或某方法加上该注解之后,表示此类或方法不再建议使用。
@SuppressWarnings:关闭不当的编译器警告信息.
@Repeatable: 重复注解
4.元注解
Java目前内置了四种标准注解,以及四种元注解;元注解就是描述注解的注解。
@Retention
注解的保留位置(枚举RetentionPolicy),RetentionPolicy可选值:
- SOURCE:注解仅存在于源码中,在class字节码文件中不包含
- CLASS:默认的保留策略,注解在class字节码文件中存在,但运行时无法获得
- RUNTIME:注解在class字节码文件中存在,在运行时可以通过反射获取到
@Inherited
声明子类可以继承此注解,如果一个类A使用此注解,则类A的子类也继承此注解
@Documented
声明注解能够被javadoc等识别
@Target
用来声明注解范围(枚举ElementType),ElementType可选值:
- TYPE:接口、类、枚举、注解
- FIELD:字段、枚举的常量
- METHOD:方法
- PARAMETER:方法参数
- CONSTRUCTOR:构造函数
- LOCAL_VARIABLE:局部变量
- ANNOTATION_TYPE:注解
- PACKAGE:包
5.自定义注解
需求:实现实体类、表的映射关系
自定义Table注解:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Inherited
public @interface Table {
String name();
}
自定义Column注解:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
@Inherited
public @interface Column {
String name();
}
定义实体类User
@Table(name = "t_user")
public class User {
@Column(name = "user_name")
private String userName;
@Column(name = "sex")
private String sex;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
测试代码
public class UserTest {
public static void main(String[] args) throws ClassNotFoundException {
//通过反射,获取字节码对象
Class<?> clazz = Class.forName("com.huawang.springboot.entity.User");
StringBuilder sb = new StringBuilder();
sb.append("select ");
//获取所有的属性值
Field[] fields = clazz.getDeclaredFields();
//获取所有的列名
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
Column column = field.getAnnotation(Column.class);
sb.append(column.name() + " ");
if (i == fields.length - 1) {
sb.append(" from ");
} else {
sb.append(",");
}
}
//获取表名
Table table = clazz.getAnnotation(Table.class);
sb.append(table.name());
System.out.println(sb.toString());
}
}
输出结果