Java编程思想-注解生成外部例子代码
如果本文帮助到您,请点击下面的链接,这是本人的网站,以示鼓励,谢谢!链接绝对安全!
java注解属于java中高大上的功能,许多开源框架都使用了java注解的功能。比如spring,hibernate等等。
从几年前的java1.5开始,java新增了泛型、注解、并发的功能。这些功能都是java高大上的功能。到现在还在广泛的使用,
说明经典的重要的知识经的住时间的考验。最新的技术不都是很重要的知识。
注解用到两个反射方法
getDeclaredMethods() 和getAnnotation(),他们都属于AnnotatedElement接口(Class,Method与Field等类都实现了该接口)
getDeclaredAnnotations和getAnnotations的区别
Annotation[] anns = field.getDeclaredAnnotations();
Annotation[] anns = field.getAnnotations();
这两个方法有什么区别是:
虽然返回的类型是一样的,但是getDeclaredAnnotations返回的是具体的声明的注解;
field.getAnnotations()使用的Field类的父类的AccessibleObject的getAnnotations方法;getAnnotations方法返回getDeclaredAnnotations方法;
getDeclaredAnnotations方法的内容是throw new AssertionError("All subclasses should override this method");
即是AccessibleObject类的所有子类必须覆盖这个方法。即正确的调用方式应该是调用子类Field的getDeclaredAnnotations方法。
getDeclaredFields和getFields的区别
Class<?>的getFields方法只返回公共的字段,如果类没有公共的字段,那么返回长度为0的数组。
Class<?>的getDeclaredFields方法返回所有声明的字段(除了继承的字段):public, protected, default (package) access, and private fields,
getDeclaredMethods和getMethods的区别
getMethods方法返回所有公共的方法,包括从父类和父接口继承的方法。
getDeclaredMethods方法返回所有public, protected, default (package) access, and private methods, 但是排除 inherited methods.(继承的字段)
/** * */ package annotation.database; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * @author Administrator * */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface Constraints { boolean primaryKey() default false; boolean allowNull() default true; boolean unique() default false; }
/** * */ package annotation.database; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * @author Administrator * */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface DBTable { public String name() default ""; }
/** * */ package annotation.database; /** * @author Administrator * */ @DBTable(name = "MEMBER") public class Member { @SQLString(30) String firstName; @SQLString(50) String lastName; @SQLInteger Integer age; @SQLString(value = 30, constraints = @Constraints(primaryKey = true)) String handle; static int memberCount; public String getFirstName() { return firstName; } public String getLastName() { return lastName; } public Integer getAge() { return age; } public String getHandle() { return handle; } public String toString() { return handle; } }
package annotation.database; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * @author Administrator * */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface SQLInteger { String name() default ""; Constraints constraints() default @Constraints; }
/** * */ package annotation.database; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * @author Administrator * */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface SQLString { int value() default 0; String name() default ""; Constraints constraints() default @Constraints; }
/** * */ package annotation.database; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; /** * @author Administrator * */ public class TableCreator { /** * @param args * @throws ClassNotFoundException */ public static void main(String[] args) throws Exception { if (args.length < 1) { System.out.println("arguments:annotated classes"); System.exit(0); } for (String className : args) { Class<?> cl = Class.forName(className); DBTable dbTable = cl.getAnnotation(DBTable.class); if (dbTable == null) { System.out.println("No DBTable annotations in class " + className); continue; } String tableName = dbTable.name(); if (tableName.length() < 1) { tableName = cl.getName().toUpperCase(); } List<String> columnDefs = new ArrayList<String>(); for (Field field : cl.getDeclaredFields()) { String columnName = null; Annotation[] anns = field.getDeclaredAnnotations(); field.getAnnotations(); if (anns.length < 1) { continue; } if (anns[0] instanceof SQLInteger) { SQLInteger sInt = (SQLInteger) anns[0]; if (sInt.name().length() < 1) { columnName = field.getName().toUpperCase(); } else { columnName = sInt.name(); } columnDefs.add(columnName + " INT" + getConstraints(sInt.constraints())); } if (anns[0] instanceof SQLString) { SQLString sString = (SQLString) anns[0]; if (sString.name().length() < 1) { columnName = field.getName().toUpperCase(); } else { columnName = sString.name(); } columnDefs.add(columnName + " VARCHAR(" + sString.value() + ")" + getConstraints(sString.constraints())); } } StringBuilder createCommand = new StringBuilder("CREATE TABLE" + tableName + "("); for (String columnDef : columnDefs) { createCommand.append("\n " + columnDef + ","); } String tableCreate = createCommand.substring(0, createCommand.length() - 1) + ");"; System.out.println("Table Creation SQL for " + className + " is :\n" + tableCreate); } } private static String getConstraints(Constraints con) { String constraints = ""; if (!con.allowNull()) { constraints += " NOT NULL"; } if (con.primaryKey()) { constraints += " PRIMARY KEY"; } if (con.unique()) { constraints += " UNIQUE"; } return constraints; } }
如果您觉得本文帮助到您,
请关注新浪微博"开心大冒险_往前冲冲冲",以示鼓励,让本人写出更好的文章帮到大家,谢谢!
或者点击下方的新浪微博分享即可。