`
dreamoftch
  • 浏览: 485893 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

自定义注解的定义和解析

阅读更多

 

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下的SpringAOP-day04-源代码

    SpringBoot下的Spring——DAY04——动态代理总结、AOP、自定义注解进行拦截、动态获取注解参数、通知方法 1.动态代理总结 1.1 JDK动态代理特点 1.2 CGlib动态代理 1.2.1 CGLib特点说明 1.3 动态代理的作用 2 Spring...

    EL表达式入门必看篇(推荐)

    JSP EL语言定义 E L(Expression Language)目的:为了使JSP写起来更加简单。 表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法。它是一种简单的语言,基于可用的命名...

    浅谈Java中注解Annotation的定义、使用、解析

    下面小编就为大家带来一篇浅谈Java中注解Annotation的定义、使用、解析。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Java语言高级部分之注解是什么?

    二、JDK中预定义的一些注解1.@Override2.@Deprecated3.@SuppressWarnings4.@SafeVarargs5.@FunctionalInterface三、自定义注解1.格式2.本质3.属性4.元注解(JDK的元Annotation)4.1.@Target4.2.@Retention4.3.@...

    Spring3MVC注解教程.ppt

    基于ConversionService体系,定义自定义的类型转换器 格式化:带格式字符串内部对象 相互转换 使用支持格式化的转换器 数据校验框架 JSR 303 数据校验框架 如何使用注解驱动的校验 使用校验功能时,处理...

    es-mapping-generator:基于自定义注释解根据Java实体模型生成elasticsearch的映射配置

    ElasticSearch映射生成器该工具允许在创建索引时为索引生成映射或设置。...使用注释描述定义的映射字段安装二进制文件部署在Maven Central上,您可以将工件导入到您的项目中: &lt; dependency&gt; &lt; groupId&gt;...

    基于JavaScript的数据可视化实验室后台管理系统源码+项目说明(期末大作业).zip

    * 登录状态保持:后端实现token值是否有效,因为大部分接口都需要验证登陆,所以进行方法抽取,用aop注解切面来返回用户信息(需要自定义注解:1.@interface + 注解名,2. 元注解:修饰注解的注解,@Target:注解用...

    Spring Web MVC入门教程

    包括:注解式开发HelloWorld、处理器定义、请求映射、REST风格支持、请求数据映射、数据绑定等诸多内容 第四章:数据类型转换 包括:简介、内建类型转换器、自定义类型转换器等 第五章:数据格式化 包括:简介、...

    Java EE常用框架.xmind

    使用@configurationProperties和@Value注解来获取SpringBoot配置文件上的信息 使用@SpringBootTest来搭建测试环境,使用@AutoConfigueMockMVC类实现Mock http操作 热部署和热加载 热部署代表的是:我们不...

    ASP.NET MVC 3高级编程

    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 ...

    DBC文件解析

    这里写自定义目录标题1、基础介绍2、DBC文件2.1、...2.2、波特率定义2.3、网络节点的定义2.4、报文帧的定义2.5、信号的定义2.6、注解部分2.7、特征(属性)定义部分:2.8、数值表部分 protuesjzy写过两篇dbc文件的介绍 ...

    Spring MVC 3.0实战指南.ppt

    基于ConversionService体系,定义自定义的类型转换器 格式化:带格式字符串内部对象 相互转换 使用支持格式化的转换器 数据校验框架 JSR 303 数据校验框架 如何使用注解驱动的校验 使用校验功能时,处理方法要...

    springboot学习思维笔记.xmind

    组合注解与元注解 @Enable*注解的工作原理 直接导入配置类 依据条件选择配置类 动态注册Bean 测试 Spring TestContext Framework集成测试 SpringMVC基础 Spring MVC概述 SpringMVC项目快速...

    spring.net中文手册在线版

    定义内联的数组、列表和词典 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.变量 ...

    maven window下安装包

    第7章:生命周期和插件/7.8 插件解析机制/7.8.2 插件的默认groupID和自定义groupID 第7章:生命周期和插件/7.8 插件解析机制/7.8.3 解析插件版本 第7章:生命周期和插件/7.8 插件解析机制/7.8.4 解析插件前缀 第8章...

    python cookbook(第3版)

    6.6 解析和修改XML 6.7 利用命名空间解析XML文档 6.8 与关系型数据库的交互 6.9 编码和解码十六进制数 6.10 编码解码Base64数据 6.11 读写二进制数组数据 6.12 读取嵌套和可变长二进制数据 6.13 数据的累加...

    springCloud

    Feign还提供了HTTP请求的模板,通过编写简单的接口和注解,就可以定义好HTTP请求的参数、格式、地址等信息。接下来,Feign会完全代理HTTP的请求,我们只需要像调用方法一样调用它就可以完成服务请求。 简而言之:...

    Spring中文帮助文档

    3.12.1. @Component和更多典型化注解 3.12.2. 自动检测组件 3.12.3. 使用过滤器自定义扫描 3.12.4. 自动检测组件的命名 3.12.5. 为自动检测的组件提供一个作用域 3.12.6. 用注解提供限定符元数据 3.13. 注册一...

    Spring API

    3.12.1. @Component和更多典型化注解 3.12.2. 自动检测组件 3.12.3. 使用过滤器自定义扫描 3.12.4. 自动检测组件的命名 3.12.5. 为自动检测的组件提供一个作用域 3.12.6. 用注解提供限定符元数据 3.13. 注册一...

Global site tag (gtag.js) - Google Analytics