- 浏览: 184319 次
- 性别:
- 来自: 苏州
文章分类
最新评论
-
wanglijunjsj:
谢谢,很有用
java log4j的一些总结 -
lxb_champagne:
this.init(); 类都没初始化好,this没用的。
java final变量的初始化问题 -
lg_asus:
上面代码有点小问题,最新代码:
public class Pr ...
判断素数 -
lg_asus:
测试10 million的以内的数据,算出所有素数时间在500 ...
判断素数 -
lg_asus:
文章中说错了:如果只是找一个数在不在其中,则可以直接遍历一次, ...
40亿不重复的正整数,如何判断一个数是否在其中
首先先定义SQLString SQLInteger Constraints这三个Annotation,下面以SQLString为代表:
然后定义AnnotationProcessor 和 AnnotationProcessorFactory, 注意内部类和观察者模式在这里的运用:
在书中,getDeclarationScanner这是DeclarationVisitors中的静态方法,作者直接引用,由于我没看import的习惯,害我找了半天,我不推荐直接引用静态方法和变量。
getDeclarationScanner中两个参数分别表示:访问每个声明前使用的Visitor,访问每个声明后的Visitor,这里只需要访问前的Visitor,因此第二个参数用DeclarationVisitors.NO_OP表示什么也不做,这里不能直接new TableCreationVisitor()作为TypeDeclaration.accept的参数,否则只有visitClassDeclaration()这个方法被调用,visitFieldDeclaration()竟然不被调用,很奇怪。SupportedType指明哪些Annotation需要处理,supportedOperation不知道什么作用。
下面是测试代码:
运行结果:
CREATE TABLE member (FIRSTNAME varchar2(30),LASTNAME varchar2(50),AGE INT,HANDLE varchar2(30) PRIMARY KEY);
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface SQLString { public int length() default 0; String name() default ""; Constraints constraints() default @Constraints(allowNull=true); }
然后定义AnnotationProcessor 和 AnnotationProcessorFactory, 注意内部类和观察者模式在这里的运用:
public class TableCreationProcessorFactory implements AnnotationProcessorFactory{ @Override public AnnotationProcessor getProcessorFor( Set<AnnotationTypeDeclaration> atds, AnnotationProcessorEnvironment env) { return new TableCreationProcessor(env); } @Override public Collection<String> supportedAnnotationTypes() { return Arrays.asList("annotations.database2.DBTable", "annotations.database2.Constraints", "annotations.database2.SQLString", "annotations.database2.SQLInteger"); } @Override public Collection<String> supportedOptions() { return Collections.emptyList(); } private class TableCreationProcessor implements AnnotationProcessor{ public TableCreationProcessor(AnnotationProcessorEnvironment env) { this.env = env; } private final AnnotationProcessorEnvironment env; private String sql = ""; @Override public void process() { for(TypeDeclaration typeDec : this.env.getTypeDeclarations()){ typeDec.accept(DeclarationVisitors.getDeclarationScanner(new TableCreationVisitor(), DeclarationVisitors.NO_OP)); sql = sql.substring(0, sql.length()-1)+");"; System.out.println("creation SQL is : "+sql); sql = ""; } } private class TableCreationVisitor extends SimpleDeclarationVisitor{ @Override public void visitClassDeclaration(ClassDeclaration d) { DBTable dbTable = d.getAnnotation(DBTable.class); if(dbTable != null){ sql +="CREATE TABLE "; sql += (dbTable.name().length() < 1) ? d.getSimpleName().toUpperCase() : dbTable.name(); sql += " ("; } } @Override public void visitFieldDeclaration( FieldDeclaration d) { if(d.getAnnotation(SQLString.class) != null){ System.out.println("process SQLString"); SQLString sqlString = d.getAnnotation(SQLString.class); sql += (sqlString.name().equals("")? d.getSimpleName().toUpperCase():sqlString.name())+" varchar2("+sqlString.length()+")" +getConstraints(sqlString.constraints())+","; }else if(d.getAnnotation(SQLInteger.class) != null){ System.out.println("process SQLInteger"); SQLInteger sqlInteger = d.getAnnotation(SQLInteger.class); sql += (sqlInteger.name().equals("")?d.getSimpleName().toUpperCase():sqlInteger.name())+" INT" +","; } } private String getConstraints(Constraints c){ String temp = ""; if(c.primaryKey()){ temp += " PRIMARY KEY"; } if(!c.allowNull()){ temp += " NOT NULL"; } if(c.unique()){ temp += " UNIQUE"; } return temp; } } } }
在书中,getDeclarationScanner这是DeclarationVisitors中的静态方法,作者直接引用,由于我没看import的习惯,害我找了半天,我不推荐直接引用静态方法和变量。
getDeclarationScanner中两个参数分别表示:访问每个声明前使用的Visitor,访问每个声明后的Visitor,这里只需要访问前的Visitor,因此第二个参数用DeclarationVisitors.NO_OP表示什么也不做,这里不能直接new TableCreationVisitor()作为TypeDeclaration.accept的参数,否则只有visitClassDeclaration()这个方法被调用,visitFieldDeclaration()竟然不被调用,很奇怪。SupportedType指明哪些Annotation需要处理,supportedOperation不知道什么作用。
下面是测试代码:
public class Test { public static void main(String...args){ try{ Process p = Runtime.getRuntime().exec("cmd /c apt -factory annotations.database2.TableCreationProcessorFactory annotations/database2/Member.java"); final BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream(),"gb2312"));//解决中文乱码 final BufferedReader error = new BufferedReader(new InputStreamReader(p.getErrorStream(),"gb2312")); new Thread(){ String str = null; @Override public void run() { try { while((str = input.readLine())!=null){ System.out.println(str); } } catch (IOException e) { e.printStackTrace(); } } }.start(); new Thread(){ String str = null; @Override public void run() { try { while((str = error.readLine())!=null){ System.out.println("Err: "+str); } } catch (IOException e) { e.printStackTrace(); } } }.start(); System.out.println("exit: "+p.waitFor()); }catch(IOException e){ e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }
运行结果:
CREATE TABLE member (FIRSTNAME varchar2(30),LASTNAME varchar2(50),AGE INT,HANDLE varchar2(30) PRIMARY KEY);
发表评论
-
Java String.intern()
2017-09-14 18:44 556在看《深入理解Java虚拟机》第二章中有如下代码: Str ... -
java开发小技巧
2013-02-28 10:06 812前面几篇blog记录的都是java中一些很基础的知识,但不经常 ... -
泛型类不能继承Throwable及其子类
2013-02-22 16:35 1344class A<T> extends Throwa ... -
根据totalRecordSize和pageRecordSize求pageCount
2013-02-18 18:18 926一直使用(totalRecordSize - 1) / pag ... -
maven学习笔记
2013-01-18 18:27 0eclipse运行需要jre环境,在编译java文件时可以没有 ... -
开发规范
2013-01-07 13:25 7811:制定API的时候,一定要考虑到参数类型、方法返回类型和所能 ... -
java异常
2012-12-28 10:30 1096运行时异常可以不捕获,即使一段代码不可能抛出这个Runtime ... -
java NIO中的Selector SelectableChannel SelectionKey
2012-12-10 14:36 1289推荐参考: http://rox-xmlrpc.sourcef ... -
java NIO通信小例子
2012-12-05 09:53 0Server端代码,selector线程专门负责接收连接,re ... -
java中CyclicBarrier和CountDownLatch的异同
2012-11-23 16:11 1467CountDownLatch只能使用一次,cyclicBarr ... -
Java&Js正则
2012-11-16 16:51 766greedy, reluctant, possessive 三 ... -
java多语言
2012-11-09 15:41 1112在eclipse plugin编程中,可以直接用继承NLS这个 ... -
URL访问文件
2012-11-01 15:57 907try{ // URL url = new URL( ... -
java 正则小知识
2012-10-11 18:43 0(?=X) X, via zero-width positiv ... -
cxf发布WS,如何在pojo中得到web.xml中配置
2012-08-02 18:48 1079用cxf直接将一个pojo作为WS进行发布,如果想在pojo中 ... -
去除代码行中前面的数字
2012-07-30 10:56 1219在网上看demo,复制代码下来执行,通常前面的行数也一起复制了 ... -
java rmi
2012-07-16 16:02 620==引自http://www.cnblogs.com/nina ... -
java取MAC地址
2012-07-12 11:29 1130jdk1.6中,NetworkInterface这个类提供了g ... -
java压缩与解压缩
2012-07-11 19:31 863public class Test5 { publ ... -
目录递归拷贝(java)
2012-07-11 16:22 1087public class Test4 { privat ...
相关推荐
The 4th edition........................ 2 Changes .......................................... 3 Note on the cover design ....... 4 Acknowledgements ................ 4 Introduction 9 Prerequisites ........
java SSH项目 hibernate annotation
Java 5 annotation 学习笔记Java 5 annotation 学习笔记Java 5 annotation 学习笔记
Java Annotation详解 Java Annotation详解 Java Annotation详解
java之Annotation及其应用
java annotation手册 关于annotation是什么东西,百度一下会有很多关于它的描述,在这里就不用再copy了,我们还是以一个示例开始吧,在开始示例之前,我们先来一个小故事。
Java annotation 什么是java annotation?annotation 的7种标注类型。nnotation提供了一条与程序元素关联任何信息或者任何元数据(metadata)的途径。从某些方面看,annotation就像修饰符一样被使用,并应用于包、...
Java-Annotation使用大全 Java-Annotation使用大全 Java-Annotation使用大全
本文针对java初学者或者annotation初次使用者全面地说明了annotation的使用方法、定义方式、分类。初学者可以通过以上的说明制作简单的annotation程序,但是对于一些高级的annotation应用(例如使用自定义annotation...
个人收集的相关Java Annotation的资源资料内容。
java-annotation-processor:JAVA注释处理器
struts 拦截器,扩展,以及java annotation 这个是我学习所用,放在此处,作为中转。
JAVA注解(Annotation).doc JAVA注解(Annotation).doc
java1.5 annotation注释源代码,
网上的Java并发编程源码一般都缺失一些Annotation,导致导入会报错。
JAVA Annotation学习示例 的一个简单示例 有源码 也有相关博客说明
Java Annotation注解技术
Java Annotation的讲解和例子~~~
Java.Annotation注解.part4
学习java自定义注解的小例子,处理运行时注解方法,可以结合博客学习,博客地址: http://blog.csdn.net/liuyonglei1314/article/details/59494503