`
zhykhs
  • 浏览: 61737 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JAVA中注解随笔

    博客分类:
  • Java
阅读更多
package _20.annotation;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

public class TableCreator {

	public static void main(String[] args) {
		try {
//			if(args.length < 1) {
//				System.out.println("arguments length incorrect!");
//				System.exit(0);
//			}
			String arr[] = new String[] {"_20.annotation.Member"}; 
			for (String clName : arr) {
				Class<?> cl = Class.forName(clName);
				DBTable dbTable = cl.getAnnotation(DBTable.class);
				if(dbTable == null) {
					System.out.println("NO DBTABLE ANNOTATION IN CLASS " + cl.getSimpleName());
					continue;
				}
				String tbName = dbTable.name();
				tbName = tbName.length() < 1 ? cl.getName().toUpperCase() : tbName;
				List<String> columnDefs = new ArrayList<String>();
				for(Field field : cl.getDeclaredFields()) {
					String columnName = null;
					Annotation[] anns = field.getAnnotations();
					if(anns.length > 0) {
						if(anns[0] instanceof SQLInteger) {
							SQLInteger sInt = (SQLInteger)anns[0];
							columnName = sInt.name().length() < 1 ? field.getName() : sInt.name();
							columnDefs.add(columnName + " INT " + getConstraints(sInt.constraints()));
						}
						if(anns[0] instanceof SQLString) {
							SQLString str = (SQLString)anns[0];
							columnName = str.name().length() < 1 ? field.getName() : str.name();
							columnDefs.add(columnName + " VARCHAR(" + str.value() + ") " + getConstraints(str.constraints()));
						}
						if(anns[0] instanceof SQLDate) {
							SQLDate sd = (SQLDate)anns[0];
							columnName = sd.name().length() < 1 ? field.getName() : sd.name();
							columnDefs.add(columnName + " DATE " + getConstraints(sd.constraints()));
						}
					}
					StringBuilder sb = new StringBuilder("CREATE TABLE " + tbName + "(");
					for (String columnDef : columnDefs) {
						sb.append("\n   " + columnDef + ",");
					}
					String tableCreate = sb.substring(0, sb.length() - 1) + ");";
					System.out.println("Table Creation SQL for " + clName + " is: \n" + tableCreate);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static String getConstraints(Constraints cons) {
		String constraints = "";
		if(!cons.allowNull()) {
			return constraints += " NOT NULL";
		}
		if(cons.primaryKey()) {
			return constraints += " PRIMARY KEY";
		}
		if(cons.unique()) {
			return constraints += " UNIQUE";
		}
		return constraints;
	}
}
 // 表示当前方法将覆盖超类中的方法,如果书写错误,编译器会给出提示 @Override /** * 用 @Deprecated 注释的程序元素,不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择。 * 在使用不被赞成的程序元素或在不被赞成的代码中执行重写时,编译器会发出警告 */ @Deprecated /** * 指示应该在注释元素(以及包含在该注释元素中的所有程序元素)中取消显示指定的编译器警告。 * 注意,在给定元素中取消显示的警告集是所有包含元素中取消显示的警告的超集。 * 例如,如果注释一个类来取消显示某个警告,同时注释一个方法来取消显示另一个警告,那么将在此方法中同时取消显示这两个警告。 * 根据风格不同,程序员应该始终在最里层的嵌套元素上使用此注释,在那里使用才有效。如果要在特定的方法中取消显示某个警告,则应该注释该方法而不是注释它的类。 */ @SuppressWarnings

 1.注解(元数据)为我们在代码中添加信息提供了一种形式化的方法。

 

2.同时也是对C#中的一些相关性质的回应(eg:override)

 

3.java.lang中自带三种标准注解以及四种原注解(描述注解的注解)

 

/**
 * 表示该注解可以用于什么地方,可能的ElementType参数包括
    TYPE,
		类,接口(包括注释类型),或者enum类型
    FIELD,
		域声明(包括enum实例)
    METHOD,
		方法声明
    PARAMETER,
		参数声明
    CONSTRUCTOR,
		构造器的声明
    LOCAL_VARIABLE,
		局部变量的声明
    ANNOTATION_TYPE,
		注解类型
    PACKAGE
    	包声明
}
 */
@Target

/**
 * 表示需要什么级别保存注解的信息。可选的RetentionPolicy参数包括:
 * 		
    SOURCE,
		注解将被编译器丢弃
    CLASS,
		注解将被VM丢弃,但在class文件中可用
    RUNTIME
    	VM将在运行期也保留注解,因此可以通过反射机制读取注解的信息
 */
@Retention

/**
 * 将此注解包含在JAVADOC中
 */
@Documented

/**
 * 允许子类继承父类中的注解
 */
@Inherited

 

 

5.简单的JAVA CODE ABOUT ANNOTATION

 

package _20.annotation;

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 _20.annotation;

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 Constraints {
	boolean primaryKey() default false;
	boolean allowNull() default true;
	boolean unique() default false;
}

 

 

package _20.annotation;

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 "";
	Constraints constraints() default @Constraints(unique = true);
}

 

package _20.annotation;

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 "";
	Constraints constraints() default @Constraints;// 默认是一个Constraints注解,注解嵌套
}

 

 

package _20.annotation;

import java.util.Date;

@DBTable(name = "MEMBER")
public class Member {
	@SQLString(30)
	private String firstName;
	@SQLString(50) 
	private String lastName;
	@SQLInteger(name = "age", constraints = @Constraints(unique = false)) 
	Integer age;
	@SQLString(value = 30, constraints = @Constraints(primaryKey = true))
	String handle;
	@SQLDate
	Date birthday;
	static int memberCount;
	public String getFirstName() {
		return firstName;
	}
	public String getLastName() {
		return lastName;
	}
	public Integer getAge() {
		return age;
	}
	public String getHandle() {
		return handle;
	}
	@Override
	public String toString() {
		return handle;
	}
}

 

 

6.使用APT处理注解.

 

package _20.annotation;

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.SOURCE)
public @interface ExtractInterface {
	public String value();
}

 

 

package _20.annotation;

import java.io.PrintWriter;
import java.lang.reflect.Modifier;
import java.util.ArrayList;

import com.sun.mirror.apt.AnnotationProcessor;
import com.sun.mirror.apt.AnnotationProcessorEnvironment;
import com.sun.mirror.declaration.MethodDeclaration;
import com.sun.mirror.declaration.ParameterDeclaration;
import com.sun.mirror.declaration.TypeDeclaration;

/**
 * 注解处理器类
 * @author zhy
 *
 */
public class InterfaceExtractProcessor implements AnnotationProcessor {
	private final AnnotationProcessorEnvironment env;
	private ArrayList<MethodDeclaration> interfaceMethods = new ArrayList<MethodDeclaration>();
	public InterfaceExtractProcessor(AnnotationProcessorEnvironment env) {
		this.env = env;
	}
	@Override
	public void process() {
		try {
			for (TypeDeclaration td : env.getSpecifiedTypeDeclarations()) {
				ExtractInterface annot = td.getAnnotation(ExtractInterface.class);
				if(annot == null) break;
				for(MethodDeclaration md : td.getMethods()) {
					if(md.getModifiers().contains(Modifier.PUBLIC) && !md.getModifiers().contains(Modifier.STATIC)) {
						interfaceMethods.add(md);
					}
					if(interfaceMethods.size() > 0) {
						PrintWriter pw = env.getFiler().createSourceFile(annot.value());
						pw.println("package " + td.getPackage().getQualifiedName() + ";");
						pw.println("public interface " + annot.value() + " {");
						for (MethodDeclaration md1 : interfaceMethods) {
							pw.println(" public ");
							pw.println(md1.getReturnType() + " ");
							pw.println(md1.getSimpleName() + " ");
							int i = 0;
							for (ParameterDeclaration pd : md1.getParameters()) {
								pw.print(pd.getType() + " " + pd.getSimpleName());
								if(++i < md1.getParameters().size()) {
									pw.print(", ");
								}
							}
							pw.println(");");
						}
						pw.println("}");
						pw.close();
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

 

package _20.annotation;

import java.util.Collection;
import java.util.Collections;
import java.util.Set;

import com.sun.mirror.apt.AnnotationProcessor;
import com.sun.mirror.apt.AnnotationProcessorEnvironment;
import com.sun.mirror.apt.AnnotationProcessorFactory;
import com.sun.mirror.declaration.AnnotationTypeDeclaration;

public class InterfaceExtractProcessorFactory implements AnnotationProcessorFactory {

	@Override
	public AnnotationProcessor getProcessorFor(
			Set<AnnotationTypeDeclaration> arg0,
			AnnotationProcessorEnvironment arg1) {
		return new InterfaceExtractProcessor(arg1);
	}

	@Override
	public Collection<String> supportedAnnotationTypes() {
		return Collections.singleton("_20.annotation.ExtractInterface");
	}

	@Override
	public Collection<String> supportedOptions() {
		return Collections.emptySet();
	}
}

 

 http://www.marsclan.org/html/experiment/document/convention/CodeConventions_V1.0.0.pdf 规范

分享到:
评论
1 楼 halk 2009-04-06  
是JDK1.6环境下么?
为什么我显示“Description Resource Path Location Type AnnotationProcessor cannot be resolved to a type”

在JDK1.5的API下有这个类,但1.6下却没找到..

相关推荐

    【Java - 框架 - Knife4j】随笔

    【Java - 框架 - Knife4j】随笔 在Java Web开发中,文档的生成与维护是一项重要但繁琐的工作。Knife4j,作为一款专门为Java RESTful API设计的文档增强工具,它极大地简化了这个过程,为开发者带来了诸多便利。本篇...

    Java学习随笔3(IDEA的概述和功能).docx

    在IDEA中创建HelloWorld程序,首先需要新建一个Project,然后添加Module,接着创建Package,最后在包内创建一个Java类。在类中,可以利用IDEA的快捷键如`psvm + 回车`快速生成main方法,`sout + 回车`快速生成System...

    【Java-框架-SpringSecurity】单点登录(认证和授权)- 随笔

    本随笔将深入探讨SpringSecurity在实现单点登录(Single Sign-On, SSO)中的关键概念和技术。 ### 一、SpringSecurity简介 SpringSecurity是一个可高度定制的安全框架,它构建在Spring框架之上,提供了一种声明式...

    SpringSecurity - 随笔

    - **Java配置**:现代实践中,更倾向于使用Java配置,通过`@EnableWebSecurity`注解启动SpringSecurity,并通过`WebSecurityConfigurerAdapter`进行自定义配置。 - **注解驱动的安全配置**:使用`@Secured`和`@...

    Dagger 工作随笔

    Dagger是一种依赖注入(DI)框架,它利用Java注解解析器和代码生成技术,实现了依赖关系的自动化管理。Dagger适用于Java和Android平台,它特别适合用于自定义类的依赖注入,而不适合直接用于UI层。在Android项目中,...

    Ibatis学习随笔

    本篇随笔将深入探讨Ibatis的核心概念、使用方法以及它在实际开发中的应用。 一、Ibatis概述 Ibatis是由Apache软件基金会维护的项目,它的设计目标是简化Java应用与数据库之间的交互,避免了传统的JDBC代码编写过程...

    学习欧阳坚Objective_C随笔

    在Objective-C中,注释可以使用`//`进行单行注释,或者使用`/* */`进行多行注释。布尔类型`BOOL`通常有两个值:`YES`和`NO`。`Id`是一个特殊的类型,它可以表示任何对象,类似于Java的`Object`或C++的`void*`。`nil`...

    学习欧阳坚OC_IOS视频随笔

    4. **协议(@protocol)**:Objective-C中的协议类似于Java或C#的接口,定义了一组方法签名,类可以遵循多个协议以实现多种功能。 5. **多态性**:Objective-C支持多态,允许子类重写父类的方法,从而在运行时根据...

    Eclipse开发工具介绍

    Annotation是Java中的一种注解机制,提供了许多功能,可以帮助开发者快速高效地开发Java应用程序。 7. Eclipse的Debug功能 Eclipse提供了Debug功能,可以帮助开发者快速地调试Java应用程序。 8. Eclipse的插件开发...

    Eclipse入门级使用教程

    * 启动 Eclipse 之后要选择一个工作区,每一个工作区之中会包含多个 Java 项目 * 面对那些奇怪的程序员,需要找窗口的时候就通过:【Window】 → 【Show View】 → 选择所需要的视图 * 在一个 Eclipse 的工作区之中...

    JDK 1.8 API 中文

    **JDK 1.8 API 中文版**是Java开发者的重要参考资料,它包含了Java Development Kit (JDK) 1.8版本的所有公共类、接口、枚举和注解的详细说明,以中文语言呈现,方便中国开发者理解和使用。API文档是编程时不可或缺...

    黄油刀绑定控件的点击事件.rar

    在这里,`@BindView`用于将XML布局中的按钮与Java代码中的变量绑定,而`@OnClick`注解则声明了当按钮被点击时应执行的方法。Butter Knife会在`onCreate`方法执行后自动处理这些注解,生成对应的监听器。 在描述中...

    Mybatis关联映射Demo

    然后,在实体类中定义相应的属性,例如`@OneToOne`, `@OneToMany`, `@ManyToMany`注解,与XML映射文件中的配置相匹配。 关联映射的加载策略也很重要,有懒加载(Lazy Loading)和立即加载(Eager Loading)。懒加载...

    shiro的全流程demo,世界shiro在spring中认证、授权流程,自定义授权类型,分布式session、授权缓存的实现

    你可以定义自定义的授权逻辑,例如在 Realm 中实现权限的解析,或者使用注解式或配置式授权。Shiro 的 ACL(Access Control List)机制允许灵活的权限控制。 在分布式环境中,Session 管理是个挑战。Shiro 可以通过...

    c#学习笔记.txt

    以至于正当Microsoft尽力在Visual J++基础上拓展Java功能,并使之与Windows操作系统紧密结合在一起的时候,Sun公司对Microsoft提出了法律诉讼,控告Microsoft违反了许可证协议中的条款,最终的结果是Microsoft公司...

    smbms管理类项目

    SSM框架是Java Web开发中常用的一种整合框架,由Spring、Spring MVC和MyBatis三个开源框架组成。这个“smbms管理类项目”就是基于SSM框架开发的一个典型应用,主要涉及到用户管理、订单管理和商品管理等功能模块。 ...

Global site tag (gtag.js) - Google Analytics