`

java annotation(注解)

    博客分类:
  • java
阅读更多
通过一个例子来认识注解:由javaBean注解生成建表sql

定义表名注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/*注解的分类
 * 1.标记注解(marker annotation)
 * 注解体内没有定义任何元素,只起一个标记提示作用
 * 常见的就是java.lang包下的Deprecated,Override,SuppressWarnings
   Deprecated 编译时会提示方法过时
   Override 编译时验证重写父类方法签名是否正确
   SuppressWarnings 取消警告
   2.元注解
   只用来修饰注解定义的注解
   下面用到的Retention,Target
   Retention用来指定定义的注解要保留到什么时候
   有三个枚举值:
   RetentionPolicy.SOURCE 编译是会调用,不会保留到class文件中
   RetentionPolicy.CLASS  会跟随保留到class文件中
   RetentionPolicy.RUNTIME 保留到class文件中,并且class被加载时还可以通过反射操作注解
   
   Target用来规定注解可以修饰的程序元素的种类
   其有一个ElementType[]的枚举数组参数
    ElementType.PACKAGE 包 
	ElementType.TYPE 类,接口,注解,枚举
	ElementType.METHOD 方法声明
	ElementType.FIELD  字段
	......
 * 注解一旦定义好之后,就可以像使用public,static这样的的modifiers一样,用注解修饰类,方法或属性
 */
@Retention(RetentionPolicy.RUNTIME)//可以保留到类被加载运行时
@Target(ElementType.TYPE) //指定该注解用来修饰类...
public @interface Table { //定义注解的关键字@interface
	/*
	 * 元素定义的返回类型限定为:基本类型,String,Class,emum,annotation
		或者是前述类型的数组
	 */
	
	String name();
}


定义字段注解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/*
 * 定义字段的注解
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD) //该注解只能用在成员变量上
public @interface Column {
	int length() default 0; //用来存放字段的长度
	String name() default "" ;//用来存放字段的名字
	//至于数据库字段的类型,后面根据反射获取成员变量的类型获取
}


定义普通javaBean,用上面的注解界定建表sql
import java.util.Date;
/*
 * 一个简单使用例子,根据注解生成创建表语句
 * 使用注解时,可以用key-value键值对的形式为注解的元素赋值
 */
@Table(name="table_person") //表名
public class PersonBean {
	@Column(length=8,name="person_id")
	private Integer id;
	@Column(length=32,name="pname")
	private String name;
	@Column(name="birth") //Date类型不需要指定length
	private Date birth;
	public Integer getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Date getBirth() {
		return birth;
	}
	public void setBirth(Date birth) {
		this.birth = birth;
	}
}


解析注解生成建表sql
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Date;

public class TestMain {
	//用来解析所有成员变量的方法
	public static String[] getColumns(Field[] fArr){
		String[] columns = new String[fArr.length];
		String columnName="";
		int columnLength=0;
		String columnType = "";
		for(int i=0;i<fArr.length;i++){
			Field f = fArr[i];
			String name = f.getName(); //成员变量名
			Class type = f.getType(); //成员变量类型
			//判断该成员变量上是不是存在Column类型的注解
			if(f.isAnnotationPresent(Column.class)){
				//存在
				Column c = f.getAnnotation(Column.class);//获取实例
				//获取元素值
				columnName = c.name();
				columnLength = c.length();
			}
			//如果未指定列名,默认列名使用成员变量名
			if("".equals(columnName)){
				columnName = name;
			}
			//如果未指定字段长度,默认32
			if(0 == columnLength){
				columnLength = 32;
			}
			//如果成员变量是String类型的,数据库字段是varchar类型
			if(String.class == type){
				columnType = "varchar";
			}else if(Integer.class == type){
				columnType = "number";//Integer类型的用number
			}
			//把每一个成员变量相关信息存放到返回数组中
			if(Date.class == type){//Date类型的用date
				columns[i] = columnName+" date";
			}else{
				columns[i] =  columnName+" "+columnType+"("+columnLength+")";
			}
		}
		return columns;
	}
	public static void main(String[] args) throws Exception {
	
		StringBuffer sql = new StringBuffer("create table ");
		Class c1 = Class.forName("com.cao.annotation.PersonBean");//加载使用注解的bean,(bean的路径包括bean的包)
		if(c1.isAnnotationPresent(Table.class)){
			//该class存在Table类型的注解,获取指定的表名
			Table table = (Table) c1.getAnnotation(Table.class);
			String tableName = table.name();
			sql.append(tableName+" (");
		}
		//获取bean所声明的成员变量(include private) 
		Field[] fArr = c1.getDeclaredFields();
		//解析这些字段的注解设定值
		String[] columns = getColumns(fArr);
		//拼接解析后的成员变量信息成创建表语句
		for(int i=0;i<columns.length;i++){
			if(i==(columns.length-1)){
				sql.append("\n"+columns[i]+")");
			}else{
				sql.append("\n"+columns[i]+",");
			}
		}
		System.out.println(sql.toString());
		/*结果:
		 *  create table table_person (
			person_id number(8),
			pname varchar(32),
			birth date)
		 */
	}
}

1
0
分享到:
评论

相关推荐

    Java Annotation注解技术

    Java Annotation注解技术是自Java SE 5.0版本引入的一种元编程机制,它允许程序员在源代码的各个层面(如类、方法、变量等)添加元数据,以供编译器、JVM或第三方工具在编译时或运行时进行处理。Annotation简化了...

    Java Annotation注解.doc

    Java Annotation,也称为注解,是Java编程语言中的一种元数据机制,用于向编译器、JVM或工具提供有关代码的附加信息。这些信息不直接影响代码的执行,但可以被编译器或运行时环境用来执行特定的操作,如代码分析、...

    Java Annotation注解

    本篇将深入探讨Java Annotation注解的相关知识点。 1. **注解类型**: Java提供了三种类型的注解:源码级注解、编译器级注解和运行时注解。源码级注解在编译后不保留,只用于源码阶段;编译器级注解会影响编译过程...

    java Annotation 注解

    Java Annotation,也称为注解,是Java编程语言中的一种元数据机制,自JDK 5.0开始引入。注解提供了在源代码中嵌入元数据的能力,这些元数据可以被编译器、构建工具或者运行时环境用来处理代码。它们在代码中看起来...

    Java.Annotation注解.part4

    Java.Annotation注解.part4

    Java.Annotation注解.part3

    Java.Annotation注解.part3

    Java.Annotation注解.part2

    Java.Annotation注解.part2

    Java.Annotation注解.part1

    Java.Annotation注解.part1

    Java自定义注解Annotation的使用

    ### Java自定义注解Annotation的使用 #### 1. 前言 自从JDK 1.5引入了注解这一特性以来,它已经成为Java开发中的一个重要组成部分。注解最初是为了推动EJB 3.0的普及和发展而设计的,其目的是减少配置文件的使用,...

    Java Annotation(Java 注解)

    如果你想知道java annotation是什么?你可以看看

    Java Annotation注解相关原理代码总结

    在Java编程语言中,Annotation(注解)是一种元数据,它提供了一种安全的方法来将信息附加到代码中,而不必改变代码的行为。注解在编译时或运行时被读取,通常用于代码分析、编译器警告、运行时处理等。下面我们将...

    spring的Annotation注解.

    ### Spring框架中的Annotation注解详解 #### 一、Spring与Annotation的基本概念 Spring框架通过引入Annotation,极大地简化了Java开发中的依赖注入(Dependency Injection, DI)和面向切面编程(AOP)的过程。...

    Java Annotation

    Java Annotation(注解)是自 Java 5.0 开始引入的一种语言元素,它为开发者提供了在代码中添加元数据的能力。简单来说,注解就像是对代码进行标记或注释的方式,这些标记可以在编译时或者运行时被读取并执行特定的...

    java 自定义注解验证

    Java 自定义注解验证是Java开发中的一个重要特性,它允许开发者创建自己的元数据,以便在编译时或运行时对代码进行验证和处理。自定义注解为代码提供了额外的信息,使得程序更具可读性、可维护性和灵活性。在本案例...

    Annotation注解的介绍和使用

    ### Annotation注解的深入解析与应用 #### 一、Annotation概览 ##### 1.1 何为元数据 元数据,在计算机科学中,是指用于描述数据的数据,它提供了关于数据本身的附加信息,有助于理解、解释和管理数据。在编程...

    Java注解Annotation验证

    Java注解Annotation用起来很方便,也越来越流行,由于其简单、简练且易于使用等特点,很多开发工具都提供了注解功能,不好的地方就是代码入侵比较严重,所以使用的时候要有一定的选择性。 这篇文章将利用注解,来做...

    Java自定义注解使用反射获取字段注解

    在Java中,注解(Annotation)主要用于编译器检查、代码生成、运行时处理等方面。本文将深入探讨如何通过反射机制来获取自定义注解以及其在字段上的应用。 首先,我们需要了解什么是自定义注解。自定义注解是以`@`...

    Java用注解的方式定义一个Servlet

    用注解的方式定义一个Servlet,就不用在web.xml中配置了。Servlet的访问URL是Servlet的必选属性,可以选择使用urlPatterns或者value定义。  像上面的AnnotationServlet可以描述成@WebServlet(name="Annotation...

    Java自定义注解实例

    Java自定义注解是Java编程语言中的一个重要特性,它允许程序员在代码中插入元数据,这些元数据可以被编译器或运行时环境用来执行特定的任务。自定义注解不仅提高了代码的可读性,还简化了代码处理,特别是在框架和库...

Global site tag (gtag.js) - Google Analytics