JAVA中注釈エッセイ

11696 ワード

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("
" + columnDef + ","); } String tableCreate = sb.substring(0, sb.length() - 1) + ");"; System.out.println("Table Creation SQL for " + clName + " is:
" + 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
/**
*@Deprescatedコメントのプログラム を して、プログラマーがこのような を することを しないのは、 、 なためか、より い があるためです.
*コンパイラは、 されないプログラム を したり、 されないコードで き えを したりすると します.
*/
@Deprecated
/**
* したコンパイラ をアノテーション (およびアノテーション に まれるすべてのプログラム )に しないようにします.
* された に されない セットは、 に されない を むすべてのスーパーセットであることに してください.
*たとえば、クラスにコメントを けて の を し、 の の を する にコメントを けた 、この では の の を に します.
*スタイルによっては、プログラマは に のネストされた でこのコメントを する があります. のメソッドで を しない は、クラスではなくメソッドをコメントする があります.
*/
@SuppressWarnings
 1. (メタデータ)は、コードに を するための な を します.
 
2.C#のいくつかの する に する でもある(eg:override)
 
3.java.langには3つの と4つの ( を する )が しています.
 
/**
 *              ,   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コード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