`
lg_asus
  • 浏览: 190787 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Thinking In Java 4th 关于Annotation处理器的观察者模式

 
阅读更多
首先先定义SQLString SQLInteger Constraints这三个Annotation,下面以SQLString为代表:
@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);
分享到:
评论

相关推荐

    Thinking in java 4th 源代码

    《Thinking in Java》是...通过研究《Thinking in Java 4th》的源代码,你不仅可以深化对Java语言的理解,还能提升编程技能,为解决实际问题打下坚实的基础。无论是初学者还是经验丰富的开发者,都能从中受益匪浅。

    Thinking in Java 4th Edition及习题答案

    《Thinking in Java 4th Edition》是Java编程领域的一本经典著作,由Bruce Eckel撰写。这本书深入浅出地介绍了Java编程语言的核心概念和技术,深受程序员喜爱。第四版更是对原有的内容进行了更新,以适应Java语言的...

    Thinking in Java 4th Edition习题答案

    《Thinking in Java 4th Edition》是一本深受程序员喜爱的经典Java教程,由Bruce Eckel撰写。这本书深入浅出地介绍了Java编程语言的核心概念和技术,包括面向对象编程、泛型、集合框架、网络编程、多线程等内容。第...

    Thinking in java 4th eidtion

    《Thinking in Java》第四版是一本备受推崇的经典Java编程教材,由Bruce Eckel撰写,适用于初学者及进阶读者。本书自出版以来,便成为众多Java程序员首选的学习资料之一,不仅因其详尽而深入的内容,还因为作者对...

    thinking in java 4th code

    《Thinking in Java》是Bruce Eckel的经典之作,它是一本深度和广度兼具的Java编程教程,深受全球程序员喜爱。第四版的代码集合(TIJ4_CODE)包含了书中所有示例程序,为读者提供了丰富的实践资源。这本书的核心知识...

    Thinking in Java 4th Edition 中英文 及 习题解答 源代码

    《Thinking in Java 4th Edition》是一本深受程序员喜爱的经典Java教程,由Bruce Eckel撰写。这本书以深入浅出的方式讲解了Java编程语言的核心概念和技术,涵盖了从基础语法到高级特性的广泛内容。中文版与英文版的...

    thinking in java 4th 样章的翻译

    《Thinking in Java》是Bruce Eckel的经典之作,第四版更是被广大Java开发者视为学习和进阶的必备书籍。本样章的翻译旨在帮助中文读者更好地理解这本书中的核心概念和技术,以便于深入学习Java编程语言。这里我们将...

    Thinking in Java 第3版+第4版(中文版+习题答案)

    3. "Thinking in Java 4th Edition.pdf" - 同样,这是第4版的PDF版本,相较于第3版,它可能包含了Java语言的新特性,如Java SE 5.0和6.0的更新,如泛型、枚举、注解等。 4. "Thinking In Java 练习题答案第四版" - ...

    Thinking in Java中文版(3和4)

    《Thinking in Java》是Java编程领域的一本经典著作,由Bruce Eckel撰写,深受程序员喜爱。这本书分为第三版和第四版,提供了英文版和中文版,适合不同语言背景的学习者。书中内容详实且深入,从基础知识到高级概念...

    Thinking in java java源代码

    《Thinking in Java》是Java编程领域的一本经典著作,由Bruce Eckel撰写,深受程序员喜爱。这本书深入浅出地介绍了Java语言的各个方面,包括基础语法、面向对象编程、集合框架、多线程、网络编程、异常处理等核心...

    thinking in java 第三版(中文版) 和第四版(英文版)

    14. **设计模式**:介绍常见的设计模式,如工厂模式、单例模式、观察者模式等,这些都是解决常见编程问题的最佳实践。 通过《Thinking in Java》的PPT,你可以系统地学习这些知识,结合实际编程练习,提升自己的...

    Thinking in Java 2nd习题及答案

    《Thinking in Java 2nd习题及答案》是学习Java编程的重要参考资料,它基于Bruce Eckel的《Thinking in Java》第二版,提供了书中的习题解答,帮助读者深入理解和掌握Java语言的核心概念与技术。这本书涵盖了Java...

    Thinking In Java 练习题答案 第四版.zip

    《Thinking in Java》是Bruce Eckel的经典之作,它深入浅出地介绍了Java编程语言的核心概念和技术。这本书的第四版更新了对Java语言的最新版本的支持,涵盖了从基础语法到高级特性的广泛内容。配合提供的练习题答案...

    java编程思想thinking in java

    《Java编程思想》是 Bruce Eckel 的经典著作,它深入浅出地介绍了Java语言的核心概念和技术,对于初学者和有经验的程序员来说都是极好的学习资源。这本书从对象的概念出发,逐步引导读者深入理解Java的世界。 1. **...

    Thinking_in_Java_4th_Edition_CN

    15. **设计模式**:书中可能涉及一些常见的设计模式,如工厂模式、单例模式、观察者模式等,这些模式是解决软件设计中常见问题的最佳实践。 通过阅读《Thinking in Java 4th Edition CN》中文版,读者将不仅掌握...

    thinking in java 4课后习题答案

    "thinking in java 4课后习题答案"是针对该书第四版的习题解答,对读者在学习过程中遇到的问题提供了参考。 习题解答通常会按照书中的章节结构进行划分,每个章节的习题都有对应的解答,帮助读者理解并巩固所学知识...

    Thinking_in_Java_4th

    《Thinking in Java 4th》不仅涵盖了以上这些知识点,还深入探讨了设计模式、并发编程、网络编程等高级主题,是一本全面学习Java编程的宝典。通过这本书,读者能够系统地掌握Java编程技能,并能将其应用到实际项目中...

    Thinking in Java第三版中文版

    《Thinking in Java》是Bruce Eckel的经典之作,第三版中文版为广大的中文读者提供了学习Java编程语言的宝贵资源。这本书深入浅出地讲解了Java的核心概念和技术,旨在帮助读者理解面向对象编程思想并掌握Java编程...

    Thinking in java第三版源码

    12. **设计模式**:《Thinking in Java》还涵盖了多种设计模式,如工厂模式、单例模式、观察者模式等,这些模式在源码中都有实际的实现示例。 通过阅读和分析《Thinking in Java》第三版的源码,开发者不仅能加深对...

Global site tag (gtag.js) - Google Analytics