think in java的例子:
首先是几个自定义注解
package com.tch.test.annotation; 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) public @interface DBTable { public String name() default ""; }
package com.tch.test.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface Constraints { public boolean primaryKey() default false; public boolean allowNull() default false; public boolean unique() default false; }
package com.tch.test.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface SQLInteger { String name() default ""; Constraints constraints() default @Constraints; }
package com.tch.test.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface SQLString { int value() default 0; String name() default ""; Constraints constraints() default @Constraints; }
然后使用这几个注解:
package com.tch.test.annotation; @DBTable(name="member") public class Member { @SQLString(30) private String firstName; @SQLString(50) private String lastName; @SQLInteger private Integer age; @SQLString(value=30,constraints=@Constraints(primaryKey=true)) private String handle; }
解析注解,生成SQL语句
package com.tch.test.annotation; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; public class Test { public static <T> void annotationCheck(Class<T> clazz){ DBTable c = clazz.getAnnotation(DBTable.class); if(c == null){ System.out.println("没有注解"); } Field[] field = clazz.getDeclaredFields(); List<String> columnDef = new ArrayList<String>(); for(Field f : field){ SQLString ss = f.getAnnotation(SQLString.class); SQLInteger si = f.getAnnotation(SQLInteger.class); if(ss != null){ columnDef.add(" "+f.getName()+" varchar("+ss.value()+") "+getConstraints(ss.constraints())); } if(si != null){ columnDef.add(" "+f.getName()+" int "+getConstraints(si.constraints())); } } StringBuilder sb = new StringBuilder(); sb.append("create table "+c.name()+"("); for(String s:columnDef){ sb.append("\n"+s+" ,"); } String result = sb.substring(0, sb.length()-1); result = result+"\n)"; System.out.println(result); } public static String getConstraints(Constraints con){ String result = ""; if(! con.allowNull()){ result+=" not null "; } if(con.primaryKey()){ result+=" primary key "; } if(con.unique()){ result+=" unique "; } return result; } public static void main(String[] args) { annotationCheck(Member.class); } }
结果:
create table member( firstName varchar(30) not null , lastName varchar(50) not null , age int not null , handle varchar(30) not null primary key )
相关推荐
SpringBoot下的Spring——DAY04——动态代理总结、AOP、自定义注解进行拦截、动态获取注解参数、通知方法 1.动态代理总结 1.1 JDK动态代理特点 1.2 CGlib动态代理 1.2.1 CGLib特点说明 1.3 动态代理的作用 2 Spring...
JSP EL语言定义 E L(Expression Language)目的:为了使JSP写起来更加简单。 表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法。它是一种简单的语言,基于可用的命名...
下面小编就为大家带来一篇浅谈Java中注解Annotation的定义、使用、解析。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
二、JDK中预定义的一些注解1.@Override2.@Deprecated3.@SuppressWarnings4.@SafeVarargs5.@FunctionalInterface三、自定义注解1.格式2.本质3.属性4.元注解(JDK的元Annotation)4.1.@Target4.2.@Retention4.3.@...
基于ConversionService体系,定义自定义的类型转换器 格式化:带格式字符串内部对象 相互转换 使用支持格式化的转换器 数据校验框架 JSR 303 数据校验框架 如何使用注解驱动的校验 使用校验功能时,处理...
ElasticSearch映射生成器该工具允许在创建索引时为索引生成映射或设置。...使用注释描述定义的映射字段安装二进制文件部署在Maven Central上,您可以将工件导入到您的项目中: < dependency> < groupId>...
* 登录状态保持:后端实现token值是否有效,因为大部分接口都需要验证登陆,所以进行方法抽取,用aop注解切面来返回用户信息(需要自定义注解:1.@interface + 注解名,2. 元注解:修饰注解的注解,@Target:注解用...
包括:注解式开发HelloWorld、处理器定义、请求映射、REST风格支持、请求数据映射、数据绑定等诸多内容 第四章:数据类型转换 包括:简介、内建类型转换器、自定义类型转换器等 第五章:数据格式化 包括:简介、...
使用@configurationProperties和@Value注解来获取SpringBoot配置文件上的信息 使用@SpringBootTest来搭建测试环境,使用@AutoConfigueMockMVC类实现Mock http操作 热部署和热加载 热部署代表的是:我们不...
6.2.1 自定义注解 125 6.2.2 ivalidatableobject 128 6.3 显示和编辑注解 129 6.3.1 display 130 6.3.2 scaffoldcolumn 130 6.3.3 displayformat 131 6.3.4 readonly 131 6.3.5 datatype 132 6.3.6 uihint ...
这里写自定义目录标题1、基础介绍2、DBC文件2.1、...2.2、波特率定义2.3、网络节点的定义2.4、报文帧的定义2.5、信号的定义2.6、注解部分2.7、特征(属性)定义部分:2.8、数值表部分 protuesjzy写过两篇dbc文件的介绍 ...
基于ConversionService体系,定义自定义的类型转换器 格式化:带格式字符串内部对象 相互转换 使用支持格式化的转换器 数据校验框架 JSR 303 数据校验框架 如何使用注解驱动的校验 使用校验功能时,处理方法要...
组合注解与元注解 @Enable*注解的工作原理 直接导入配置类 依据条件选择配置类 动态注册Bean 测试 Spring TestContext Framework集成测试 SpringMVC基础 Spring MVC概述 SpringMVC项目快速...
定义内联的数组、列表和词典 10.3.3.方法 10.3.4.操作符 10.3.4.1.关系操作符 10.3.4.2.逻辑操作符 10.3.4.3.算术运算符 10.3.5.赋值 10.3.6.表达式列表 10.3.7.类型 10.3.8.类型注册 10.3.9.构造器 10.3.10.变量 ...
第7章:生命周期和插件/7.8 插件解析机制/7.8.2 插件的默认groupID和自定义groupID 第7章:生命周期和插件/7.8 插件解析机制/7.8.3 解析插件版本 第7章:生命周期和插件/7.8 插件解析机制/7.8.4 解析插件前缀 第8章...
6.6 解析和修改XML 6.7 利用命名空间解析XML文档 6.8 与关系型数据库的交互 6.9 编码和解码十六进制数 6.10 编码解码Base64数据 6.11 读写二进制数组数据 6.12 读取嵌套和可变长二进制数据 6.13 数据的累加...
Feign还提供了HTTP请求的模板,通过编写简单的接口和注解,就可以定义好HTTP请求的参数、格式、地址等信息。接下来,Feign会完全代理HTTP的请求,我们只需要像调用方法一样调用它就可以完成服务请求。 简而言之:...
3.12.1. @Component和更多典型化注解 3.12.2. 自动检测组件 3.12.3. 使用过滤器自定义扫描 3.12.4. 自动检测组件的命名 3.12.5. 为自动检测的组件提供一个作用域 3.12.6. 用注解提供限定符元数据 3.13. 注册一...
3.12.1. @Component和更多典型化注解 3.12.2. 自动检测组件 3.12.3. 使用过滤器自定义扫描 3.12.4. 自动检测组件的命名 3.12.5. 为自动检测的组件提供一个作用域 3.12.6. 用注解提供限定符元数据 3.13. 注册一...