注解
注解为我们在代码中添加信息提供了形式化的方法, 使我们可以在稍后某个时刻非常方便的使用这些元素.
Java支持的三种标准注解
- @Override
- @Deprecated
- @Suppress Warnings
Java支持的四种元注解
注解元素
注解元素可以用的类型如下所示
- 所有基本类型 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())); } } }
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(); } }
|