• 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("
     " + columnDef + ",");
                }
                String tableCreate = createCommand.substring(0,
                        createCommand.length() - 1)
                        + ");";
                System.out.println("Table Creation SQL for " + className
                        + " is :
    " + 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;
        }
    
    }

     如果您觉得本文帮助到您,
    请关注新浪微博"开心大冒险_往前冲冲冲",以示鼓励,让本人写出更好的文章帮到大家,谢谢!

    或者点击下方的新浪微博分享即可。

     

  • 相关阅读:
    Java常用类之【日期相关类】
    Java常用类之【Math类、Random类、System类、Runtime类】
    Java常用类之【字符串相关类型】
    Java常用类之【八种基本数据类型】
    打印杨辉三角--for循环
    Eclipse设置文字大小
    Eclipse之JSON导包
    Java中设计模式之工厂模式-4
    PC 微信页面倒计时代码 safari不兼容date的问题
    在apache中设置访问目录后进入的默认页面为index.php
  • 原文地址:https://www.cnblogs.com/usual2013blog/p/4115132.html
Copyright © 2020-2023  润新知