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