最近在看一个同事写的web框架,其中大量使用了annotation,整体上代码给人的感觉十分简洁明了,主要的思路是:将一些业务校验(如:用户权限校验、商品合法性校验)这些通用的业务逻辑抽取出来,构建一些列独立的annotation,然后在页面代码中嵌入这些annotation,结果就会大幅度减少代码量。用同事的一句话说,少得代码才是好的代码。O(∩_∩)O~
以前编码的中很少使用annotation,翻了一下think in java。
主要思路是:
1.编写annotation
2.编写解释器。
3.运行到相关代码的时候使用解释器去解释执行这些代码。
核心思想还是java的反射机制。
废话少说,一个通过annotation自动生成SQL语句的工具,代码如下:
主要包含:
1.基本数据结构annotation,包含了sql中的基本数据结构(demo中包含:int、string类型),包括自动名称、字段长度的等信息,以及新建的表的名字。
2.使用这些annotation构建一个DO对象,对象中的成员变量使用我们自定义的annotation修饰。
3.自定义annotation解释器,对待建表DO中做了annotation声明的成员变量进行解析。
package com.anatation.database; 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 ""; //字段附加属性 Constrains constrains() default @Constrains; }
package com.anatation.database; 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 ""; Constrains constrain() default @Constrains; }
package com.anatation.database; 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 Constrains { boolean primaryKey() default false; boolean unique() default false; boolean allowNull() default true; }
package com.anatation.database; 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 annatationTest; import com.anatation.database.Constrains; import com.anatation.database.DBTable; import com.anatation.database.SQLInteger; import com.anatation.database.SQLString; @DBTable(name="memeber") public class Member { @SQLString(value=30,constrains=@Constrains(allowNull=false)) private String firstName; @SQLString(10) private String lastName; @SQLInteger private int age; @SQLString(value=10, constrains=@Constrains(primaryKey=true,unique=true)) private String handle; @SQLInteger private int level; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getHandle() { return handle; } public void setHandle(String handle) { this.handle = handle; } public int getLevel() { return level; } public void setLevel(int level) { this.level = level; } }
package annatationTest; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import com.anatation.database.Constrains; import com.anatation.database.DBTable; import com.anatation.database.SQLInteger; import com.anatation.database.SQLString; public class AnatationTest { public static void main(String[] args) { String[] classNames = {"annatationTest.Member"}; try{ for(String className : classNames){ Class cl = Class.forName(className); DBTable dbTable = (DBTable) cl.getAnnotation(DBTable.class); if(dbTable == null) continue; String tableName = dbTable.name(); if(tableName.length() <= 0){ tableName = cl.getSimpleName(); } List<String> columnNames = new ArrayList<String>(); for(Field field : cl.getDeclaredFields()){ String columnName = ""; Annotation[] annotations = field.getDeclaredAnnotations(); if(annotations.length <= 0) continue; if(annotations[0] instanceof SQLInteger){ SQLInteger tmpSqlInt = (SQLInteger)annotations[0]; columnName = tmpSqlInt.name(); if(columnName.length() <= 0){ columnName = field.getName()+" integer"; } String constrain = getConstraon(tmpSqlInt.constrain()); columnName += constrain; } if(annotations[0] instanceof SQLString){ SQLString tmpSqlStr = (SQLString)annotations[0]; columnName = tmpSqlStr.name(); if(columnName.length() <= 0){ columnName = field.getName(); }if(tmpSqlStr.value() > 0){ columnName += " varchar("+ tmpSqlStr.value()+") "; } String constrain = getConstraon(tmpSqlStr.constrains()); columnName += constrain; } columnNames.add(columnName); } String sqlCreat = "CREATE TABLE "+ tableName +" ( \n"; String createCommond = ""; for(String str : columnNames){ createCommond += str +",\n"; } sqlCreat += createCommond +" ) "; System.out.println(sqlCreat); } }catch (Exception e) { System.out.println(e); } } private static String getConstraon(Constrains constrain) { String rst = ""; if(!constrain.allowNull()){ rst += " NOT NULL "; } if(constrain.primaryKey()){ rst += " primarykey ".toUpperCase(); } if(constrain.unique()){ rst += " unique ".toUpperCase(); } return rst; } }
相关推荐
Java-Annotation使用大全 Java-Annotation使用大全 Java-Annotation使用大全
Java 5引入的注解(Annotation)是一种元数据,它提供了在代码中嵌入信息的方式,这些信息可以被编译器、JVM或其他工具在编译时或运行时使用。注解可以用来简化代码,提高可维护性,并帮助工具进行静态分析。 1. ...
Java注解(Annotation)是Java语言的一个重要特性,它为元数据提供了强大的支持。元数据是一种描述数据的数据,可以提供有关代码的附加信息,而这些信息并不直接影响代码的执行。在Java中,注解用于向编译器、JVM或...
从某些方面看,annotation就像修饰符一样被使用,并应用于包、类型、构造方法、方法、成员变量、参数、本地变量的声明中。这些信息被存储在annotation的“name=value”结构对中。annotation类型是一种接口,能够通过...
Java Annotation(注解)是自 Java 5.0 开始引入的一种语言元素,它为开发者提供了在代码中添加元数据的能力。简单来说,注解就像是对代码进行标记或注释的方式,这些标记可以在编译时或者运行时被读取并执行特定的...
Java 1.5 引入了一种新的元编程机制——注解(Annotation),极大地增强了代码的可读性和可维护性。注解是一种在代码中添加元数据的方式,它允许程序员在源代码上添加一些信息,这些信息可以被编译器或运行时环境...
Java 注解(Annotation)是Java语言中的一个重要特性,它为程序元素提供了附加信息,这些信息可以用于编译器检查、代码分析、运行时处理等多种用途。注解在代码中类似于修饰符,可以应用于包、类、接口、方法、字段、...
Java Annotation 是 JDK5.0 引入的一种元数据机制,它允许程序员在代码中嵌入额外的信息,这些信息可以被编译器、构建工具或运行时系统用来执行特定的任务。Annotation 提供了一种安全、灵活的方式来描述代码的属性...
Java 注解(Annotation)是一种元数据,用于向编译器、JVM 或工具提供有关代码的信息。元数据是关于数据的数据,它不直接影响程序的执行,但可以被编译器或运行时系统用来生成代码、验证类型、实现动态代理等。在 ...
在"java annotation demo"中,我们将探讨如何创建和使用注解以及如何通过反射来获取和处理这些注解。 首先,注解的定义通常使用`@interface`关键字。例如,我们创建一个简单的`MyAnnotation`注解: ```java public...
通过上述示例中的JavaAnnotation压缩包,你可能包含了注解的使用示例、源码以及相关的博客文章。源码可以帮助你理解注解的实际应用,而博客文章可能深入解释了注解的工作原理和最佳实践。学习这些材料,将有助于你...
2. 应用注解:在代码中使用定义好的注解,例如: ```java @MyClassAnnotation(uri = "com.example.MyClass", desc = "This is a test class") public class MyClass { @MyFieldAnnotation(uri = ...
Java注解(JDK5)是Java编程语言中的一个重要特性,自Java 5版本开始引入。注解(Annotation)提供了一种元数据的形式,允许程序员在代码中嵌入额外的信息,这些信息可以被编译器、JVM或者专门的处理工具在编译时或...
Java SSH项目是基于三个主要框架——Struts、Spring和Hibernate构建的企业级Web应用程序。这个项目中,Hibernate作为ORM...Hibernate注解的使用简化了数据库配置,提高了开发效率,是现代Java开发中常见的技术栈选择。
### Java自定义注解Annotation的使用 #### 1. 前言 自从JDK 1.5引入了注解这一特性以来,它已经成为Java开发中的一个重要组成部分。注解最初是为了推动EJB 3.0的普及和发展而设计的,其目的是减少配置文件的使用,...
在Java编程语言中,注解(Annotation)是一种元数据,它提供了在编译时或运行时处理代码的一种方式。通过注解,开发者可以向编译器或JVM提供有关代码的附加信息,而这些信息通常不直接影响程序的执行,但可以用于...
Java Annotation,也称为注解,是Java编程语言中的一种元数据机制,用于向编译器、JVM或工具提供有关代码的附加信息。这些信息不直接影响代码的执行,但可以被编译器或运行时环境用来执行特定的操作,如代码分析、...
元数据在编程中扮演着至关重要的角色,尤其是在Java中,通过注解(Annotation)这一特性,元数据被广泛应用于多个方面,包括但不限于文档生成、代码分析以及编译时的检查。尽管元数据作用的分类并未有固定的标准,但...
Java Annotation 是一种元数据,它为程序元素(如包、类、方法等)提供附加信息。这些信息不直接影响代码的执行,但可以被编译器、工具或运行时系统用来进行各种处理,如代码分析、验证、代码生成等。Annotation 以 ...