Annotation是给类,方法或域上加的一种特殊的标记,可以通过反射取到注解的类型和值,从而完成某种特定的操作。

定义注解需要使用元注解,元注解有@Retention和@Target

//@Retention用来定义该注解在哪一个级别可用,在源代码中(SOURCE),类文件中(CLASS),或者运行时(RUNTIME)

//@Target用来定义注解将用在什么地方   类,方法,域...

比如:

@Retention(RetentionPolicy.RUNTIME)  表明在运行时保留该注解

@Target(ElementType.METHOD)    表明为方法注解,只能在方法声明中使用

注解不支持继承,注解元素的类型可以是基本类型,String,Class, enum, 和另一个注解。

没有元素的注解称为标记注解。

简单例子:

----------根据Java Bean建立数据库表-----------

//数据库字段属性枚举
public enum EOption {
//可空
NONE, //非空
NOT_NULL, PRIMARY, UNIQUE; public boolean withIn(EOption[] options){
for(EOption o : options){
if(o==this){
return true;
}
}
return false;
} }

----------

//数据库字段类型枚举
public enum EType { //自动判断
AUTO, CHAR, VARCHAR, SMALLINT, INT, BIGINT, TEXT, BLOB, DATE;
}

---------数据表注解------

@Retention(RUNTIME)
@Target(TYPE)
public @interface DTable {
//表名
public String name() default ""; }

--------表字段注解------

@Retention(RUNTIME)
@Target(FIELD)
public @interface DColumn { //字段类型
EType type() default EType.VARCHAR; //类型相关值
int value() default 10; //字段名称
String name() default ""; //字段属性
EOption[] option() default EOption.NOT_NULL; }

--------测试Bean-----

@DTable(name="user_t")
public class UserBean { @DColumn(type=EType.INT, option={EOption.NOT_NULL, EOption.PRIMARY})
private int id; @DColumn(30)
private String name; @DColumn(type=EType.INT)
private Integer age; @DColumn(30)
private String email; @DColumn(type=EType.DATE)
private String create_date; }

--------执行建表--------

public class TableCreator {

    private static String getCon(EOption[] options) {
String ret = "";
if (EOption.NOT_NULL.withIn(options)) {
ret += " NOT NULL ";
}
if (EOption.PRIMARY.withIn(options)) {
ret += " PRIMARY KEY ";
}
if (EOption.UNIQUE.withIn(options)) {
ret += " UNIQUE ";
}
return ret;
} public static void main(String[] args) throws ClassNotFoundException { String classname = "dbAnnotation.UserBean"; Class<?> c = Class.forName(classname);
DTable table = (DTable) c.getAnnotation(DTable.class);
if (table == null) {
System.out.println(c.getName() + " no DTable Annotation");
return;
}
String tableName = table.name();
if (tableName.length() < 1) {
tableName = c.getName().toLowerCase();
} List<String> columnNames = new ArrayList<>();
for (Field f : c.getDeclaredFields()) { Annotation[] a = f.getDeclaredAnnotations();
if (a.length < 1) {
continue;
}
DColumn dcol = (DColumn) a[0];
String cName = dcol.name().length() < 1 ? f.getName().toLowerCase() : dcol.name(); if (dcol.type() == EType.INT)
{
columnNames.add(cName + " INT" + getCon(dcol.option()));
}
else if (dcol.type() == EType.VARCHAR)
{
columnNames.add(cName + " VARCHAR(" + dcol.value() + ")" + getCon(dcol.option()));
} } StringBuilder sb = new StringBuilder();
sb.append("create table ");
sb.append(tableName);
sb.append(" (\n");
for (String s : columnNames) {
sb.append(s);
sb.append(",\n");
}
sb.append(")"); System.out.println(sb.toString());
} }

-------输出------

create table user_t (
id INT NOT NULL PRIMARY KEY ,
name VARCHAR(30) NOT NULL ,
age INT NOT NULL ,
email VARCHAR(30) NOT NULL ,
)

-------

end



最新文章

  1. Ford-Fulkerson 最大流算法
  2. [转].NET Core中的认证管理解析
  3. 第七课——iOS数据持久化
  4. OC description
  5. python学习笔记系列----(二)控制流
  6. 图书馆管理系统—NABCD模型竞争性需求分析
  7. 使用ssh免密码登录其他机器
  8. wcf精通1-15
  9. 尽可能使用 const
  10. 利用 img 和 script 发送跨域请求
  11. Innode引擎监控的开启的方法
  12. 高并发的常见策略--大型web项目
  13. CentOS 6用snmp配合MRTG显示系统状态
  14. QF——iOS程序运行原理(APP的生命周期)
  15. 任务栏流量监测工具 NetSpeedMonitor 在Windows 8下的安装使用
  16. MySql状态查看方法 MySql如何查看连接数和状态?
  17. CodeForces 721C Journey
  18. Maven(十三)Maven统一声明版本号
  19. elasticsearch学习之根据发布时间设置衰减函数
  20. stylie工具轻松搞定css3抛物线动画

热门文章

  1. MyISAM表加字段的特殊方法
  2. 深入了解ios系统机制
  3. php有效的过滤html标签,js代码,css样式标签
  4. javascript 原型链
  5. BizTalk动手实验(十六)EDI-AS2解决文案开发配置
  6. IOS第11天(2:UIPickerView自定义国旗选择)
  7. struct大小
  8. java环境搭建系列:JDK从下载安装到简单使用
  9. [转]快速构建App界面的框架(●&#39;◡&#39;●) -----SalutJs
  10. ng-model和ng-bind区别