- 浏览: 190116 次
- 性别:
- 来自: 苏州
文章分类
最新评论
-
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 610在看《深入理解Java虚拟机》第二章中有如下代码: Str ... -
java开发小技巧
2013-02-28 10:06 856前面几篇blog记录的都是java中一些很基础的知识,但不经常 ... -
泛型类不能继承Throwable及其子类
2013-02-22 16:35 1401class A<T> extends Throwa ... -
根据totalRecordSize和pageRecordSize求pageCount
2013-02-18 18:18 963一直使用(totalRecordSize - 1) / pag ... -
maven学习笔记
2013-01-18 18:27 0eclipse运行需要jre环境,在编译java文件时可以没有 ... -
开发规范
2013-01-07 13:25 8151:制定API的时候,一定要考虑到参数类型、方法返回类型和所能 ... -
java异常
2012-12-28 10:30 1176运行时异常可以不捕获,即使一段代码不可能抛出这个Runtime ... -
java NIO中的Selector SelectableChannel SelectionKey
2012-12-10 14:36 1330推荐参考: http://rox-xmlrpc.sourcef ... -
java NIO通信小例子
2012-12-05 09:53 0Server端代码,selector线程专门负责接收连接,re ... -
java中CyclicBarrier和CountDownLatch的异同
2012-11-23 16:11 1531CountDownLatch只能使用一次,cyclicBarr ... -
Java&Js正则
2012-11-16 16:51 798greedy, reluctant, possessive 三 ... -
java多语言
2012-11-09 15:41 1166在eclipse plugin编程中,可以直接用继承NLS这个 ... -
URL访问文件
2012-11-01 15:57 975try{ // 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 1128用cxf直接将一个pojo作为WS进行发布,如果想在pojo中 ... -
去除代码行中前面的数字
2012-07-30 10:56 1247在网上看demo,复制代码下来执行,通常前面的行数也一起复制了 ... -
java rmi
2012-07-16 16:02 660==引自http://www.cnblogs.com/nina ... -
java取MAC地址
2012-07-12 11:29 1173jdk1.6中,NetworkInterface这个类提供了g ... -
java压缩与解压缩
2012-07-11 19:31 895public class Test5 { publ ... -
目录递归拷贝(java)
2012-07-11 16:22 1122public class Test4 { privat ...
相关推荐
《Thinking in Java》是...通过研究《Thinking in Java 4th》的源代码,你不仅可以深化对Java语言的理解,还能提升编程技能,为解决实际问题打下坚实的基础。无论是初学者还是经验丰富的开发者,都能从中受益匪浅。
《Thinking in Java 4th Edition》是Java编程领域的一本经典著作,由Bruce Eckel撰写。这本书深入浅出地介绍了Java编程语言的核心概念和技术,深受程序员喜爱。第四版更是对原有的内容进行了更新,以适应Java语言的...
《Thinking in Java 4th Edition》是一本深受程序员喜爱的经典Java教程,由Bruce Eckel撰写。这本书深入浅出地介绍了Java编程语言的核心概念和技术,包括面向对象编程、泛型、集合框架、网络编程、多线程等内容。第...
《Thinking in Java》第四版是一本备受推崇的经典Java编程教材,由Bruce Eckel撰写,适用于初学者及进阶读者。本书自出版以来,便成为众多Java程序员首选的学习资料之一,不仅因其详尽而深入的内容,还因为作者对...
《Thinking in Java》是Bruce Eckel的经典之作,它是一本深度和广度兼具的Java编程教程,深受全球程序员喜爱。第四版的代码集合(TIJ4_CODE)包含了书中所有示例程序,为读者提供了丰富的实践资源。这本书的核心知识...
《Thinking in Java 4th Edition》是一本深受程序员喜爱的经典Java教程,由Bruce Eckel撰写。这本书以深入浅出的方式讲解了Java编程语言的核心概念和技术,涵盖了从基础语法到高级特性的广泛内容。中文版与英文版的...
《Thinking in Java》是Bruce Eckel的经典之作,第四版更是被广大Java开发者视为学习和进阶的必备书籍。本样章的翻译旨在帮助中文读者更好地理解这本书中的核心概念和技术,以便于深入学习Java编程语言。这里我们将...
3. "Thinking in Java 4th Edition.pdf" - 同样,这是第4版的PDF版本,相较于第3版,它可能包含了Java语言的新特性,如Java SE 5.0和6.0的更新,如泛型、枚举、注解等。 4. "Thinking In Java 练习题答案第四版" - ...
《Thinking in Java》是Java编程领域的一本经典著作,由Bruce Eckel撰写,深受程序员喜爱。这本书分为第三版和第四版,提供了英文版和中文版,适合不同语言背景的学习者。书中内容详实且深入,从基础知识到高级概念...
《Thinking in Java》是Java编程领域的一本经典著作,由Bruce Eckel撰写,深受程序员喜爱。这本书深入浅出地介绍了Java语言的各个方面,包括基础语法、面向对象编程、集合框架、多线程、网络编程、异常处理等核心...
14. **设计模式**:介绍常见的设计模式,如工厂模式、单例模式、观察者模式等,这些都是解决常见编程问题的最佳实践。 通过《Thinking in Java》的PPT,你可以系统地学习这些知识,结合实际编程练习,提升自己的...
《Thinking in Java 2nd习题及答案》是学习Java编程的重要参考资料,它基于Bruce Eckel的《Thinking in Java》第二版,提供了书中的习题解答,帮助读者深入理解和掌握Java语言的核心概念与技术。这本书涵盖了Java...
《Thinking in Java》是Bruce Eckel的经典之作,它深入浅出地介绍了Java编程语言的核心概念和技术。这本书的第四版更新了对Java语言的最新版本的支持,涵盖了从基础语法到高级特性的广泛内容。配合提供的练习题答案...
《Java编程思想》是 Bruce Eckel 的经典著作,它深入浅出地介绍了Java语言的核心概念和技术,对于初学者和有经验的程序员来说都是极好的学习资源。这本书从对象的概念出发,逐步引导读者深入理解Java的世界。 1. **...
15. **设计模式**:书中可能涉及一些常见的设计模式,如工厂模式、单例模式、观察者模式等,这些模式是解决软件设计中常见问题的最佳实践。 通过阅读《Thinking in Java 4th Edition CN》中文版,读者将不仅掌握...
"thinking in java 4课后习题答案"是针对该书第四版的习题解答,对读者在学习过程中遇到的问题提供了参考。 习题解答通常会按照书中的章节结构进行划分,每个章节的习题都有对应的解答,帮助读者理解并巩固所学知识...
《Thinking in Java 4th》不仅涵盖了以上这些知识点,还深入探讨了设计模式、并发编程、网络编程等高级主题,是一本全面学习Java编程的宝典。通过这本书,读者能够系统地掌握Java编程技能,并能将其应用到实际项目中...
《Thinking in Java》是Bruce Eckel的经典之作,第三版中文版为广大的中文读者提供了学习Java编程语言的宝贵资源。这本书深入浅出地讲解了Java的核心概念和技术,旨在帮助读者理解面向对象编程思想并掌握Java编程...
12. **设计模式**:《Thinking in Java》还涵盖了多种设计模式,如工厂模式、单例模式、观察者模式等,这些模式在源码中都有实际的实现示例。 通过阅读和分析《Thinking in Java》第三版的源码,开发者不仅能加深对...