0%

注解

注解

注解为我们在代码中添加信息提供了形式化的方法, 使我们可以在稍后某个时刻非常方便的使用这些元素.

Java支持的三种标准注解

  • @Override
  • @Deprecated
  • @Suppress Warnings

Java支持的四种元注解

  • @Targe

    表示该注解可以用于什么地方.可能的ElementType参数包括

    • CONSTRUCTOR 构造方法
    • FIELD 成员变量
    • LOCAL_VARIABLE 局部变量
    • METHOD 方法
    • PACKAGE 包
    • PAPAMETER 参数
    • TYPE 类, 接口, 枚举
  • @Retention riˈtenCHən

    • SOURCE 注解将被编译器丢弃
    • CLASS 注解在class文件中可用, 但是会被VM丢弃
    • RUNTIME VM 在运行期间也保留注解, 可以通过反射机制来获取注解的信息
  • @Documented

    将该注解包含在javadoc 中

  • @Inherited

    允许子类继承父类中的注解

注解元素

注解元素可以用的类型如下所示

  • 所有基本类型 int, long, float, double, short, byte, boolean, void
  • String
  • Class
  • enum
  • Annotation
  • 以上类型的数组

生成外部文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface DbTable {
public String name() default "";
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface ConStraints {
boolean primaryKey() default false;
boolean allowNull() default true;
boolean unqiue() default false;
}

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface SQLString {
int value() default 0;
String name() default "";
//
ConStraints conStraints() default @ConStraints;
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface SQLInter {
String name() default "";
ConStraints conStraints() default @ConStraints;
}

在使用的时候

1
2
3
4
5
6
7
8
9
10
11
12
@DbTable(name = "member")
@Date
public class Member {
@SQLString(30)
private String firstName;
@SQLString(50)
private String lastName;
@SQLInter
private Integer age;
@SQLString(value = 30, conStraints = @ConStraints(primaryKey = true))
private String handler;
}

框架是通过类似这样的方法来解析的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
public class Main {
public static void main(String[] args) {
Class member = Member.class;
DbTable dbTable = member.getAnnotationsByType(DbTable.class);
if (! Objects.isNull(dbTable)) {
String tableName = dbTable.name();
if (! Objects.isNull(tableName) && tableName.length() > 0) {
tableName = tableName.toUpperCase();
} else {
tableName = member.getName().toUpperCase();
}
Field[] fields = member.getDeclaredFields();
StringBuilder[] fieldsDefs = new StringBuilder[fields.length];

for (int i = 0; i < fields.length; i ++) {
Field field = fields[i];
fieldsDef[i] = new StringBuilder();

Annotation[] annotations = field.getAnnotations();
if (annotations.length == 0) {
continue;
}
for (Annotation annotation : annotations) {
String columnName = "";
if (annotation instanceof SQLInter) {
SQLInter sqlInter = (SQLInter) annotation;
fieldsDef[i].append(" INT ").append( getConstrains(sqlInter.conStraints()));
}
}
// many many other type
}

StringBuilder createCommand = new StringBuilder();
createCommand.append("crate table ").append(tableName).append(" (");
for (StringBuilder stringBuilder : fieldsDefs ) {
createCommand.append(stringBuilder).append(" , ");
}
// 去掉最后一个逗号
createCommand = createCommand.subSequence(0, createCommand.length() - 2);
createCommand.append(" );");
}
}

private static String getConstrains(ConStraints con) {
StringBuilder constraints = new StringBuilder();
if (! con.allowNull()) {
constraints.append(" NOT NUll ");
}

if (con.primaryKey()) {
constraints.append(" PRIMARY KEY ");
}

if (con.unqiue()) {
constraints.append(" UNIQUE ");
}

return constraints.toString();
}
}