美文网首页
【JAVA注解】- 自定义注解的一个Demo

【JAVA注解】- 自定义注解的一个Demo

作者: lconcise | 来源:发表于2019-05-20 17:58 被阅读0次

自定义注解的一个Demo

表名注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface DBTable {

    String name() default "";
}

字段约束

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Constraints {

    boolean primaryKey() default false;

    boolean allowNull() default true;

    boolean unique() default false;
}

字段类型

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SQLInteger {

    String name() default "";

    Constraints constraints() default @Constraints;
}

字段类型

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SQLString {
    int value() default 0;

    String name() default "";

    Constraints constraints() default @Constraints;
}

自定义注解的使用

@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;

    @Override
    public String toString() {
        return handle;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public Integer getAge() {
        return age;
    }

    public String getHandle() {
        return handle;
    }
}

解析注解

public class AnnotationMain {

    public static void main(String[] args) throws Exception {
        // 获取类的字节码文件对象
        // 获取类的字节码文件对象
        Class<?> aClass = Class.forName("top.lconcise.annotationdemo2.Member");

        // 获取表名
        DBTable dbTable = aClass.getAnnotation(DBTable.class);
        String tableName = dbTable.name();


        List<String> columnDefs = new ArrayList<>();

        // 获取所有成员变量
        Arrays.stream(aClass.getDeclaredFields()).forEach(field -> {
            // 获取所有成员变量的注解
            Arrays.stream(field.getDeclaredAnnotations()).forEach(annotation -> {
                String columnName;
                if (annotation instanceof SQLInteger) {
                    SQLInteger sInt = (SQLInteger) annotation;
                    if (sInt.name().length() < 1) {
                        columnName = field.getName().toUpperCase();
                    } else {
                        columnName = sInt.name();
                    }
                    columnDefs.add(columnName + " INT" + getConstraints(sInt.constraints()));
                }
                if (annotation instanceof SQLString) {
                    SQLString sString = (SQLString) annotation;
                    if (sString.name().length() < 1) {
                        columnName = field.getName().toUpperCase();
                    } else {
                        columnName = sString.name();
                    }
                    columnDefs.add(columnName + " VARCHAR(" + sString.value() + ")" + getConstraints(sString.constraints()));
                }
            });
        });
        StringBuilder createComand = new StringBuilder("CREATE TABLE " + tableName + "(");
        columnDefs.forEach(columDef ->
                createComand.append("\n   " + columDef + ",")
        );

        String tableCreate = createComand.substring(0, createComand.length() - 1) + ");";
        System.out.println("Tabled Creation SQL for " + tableName + " is :\n " + tableCreate);
    }

    public 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;
    }
}

输出


image.png

相关文章

  • 【JAVA注解】- 自定义注解的一个Demo

    自定义注解的一个Demo 表名注解 字段约束 字段类型 字段类型 自定义注解的使用 解析注解 输出

  • 注解学习笔记

    什么是注解注解分类注解作用分类 元注解 Java内置注解 自定义注解自定义注解实现及使用编译时注解注解处理器注解处...

  • JAVA中的注解

    abstract 什么是java中的注解 注解的定义 自定义一个注解 什么是java中的注解 注解提供了一种安全的...

  • 注解的使用

    元注解 注解 注解本质就是接口: 元注解:修饰注解的注解 自定义注解 Text.java FruitName.ja...

  • 注解

    Java注解 注解 元注解 自定义注解 元注解:负责注解其他注解 共有4个标准的meta-annotation类型...

  • 一个简单的自定义注解

    1、定义一个自定义注解 2、使用注解 3、利用反射获取注解的值 java注解是怎么实现的?

  • Java注解知识梳理—自定义注解处理器

    Java注解知识梳理—自定义注解处理器 前言 前面介绍了如何自定义注解以及Java中关于注解的一些元素作用,学会了...

  • 自定义validation注解进行校验

    有时候我们需要自定义注解进行校验前端的入参依赖 demo 自定义注解 实现

  • Java注解教程及自定义注解

    创建Java自定义注解 创建自定义注解和创建一个接口相似,但是注解的interface关键字需要以@符号开头。我们...

  • 自定义注解

    创建Java自定义注解 创建自定义注解和创建一个接口相似,但是注解的interface关键字需要以@符号开头。我们...

网友评论

      本文标题:【JAVA注解】- 自定义注解的一个Demo

      本文链接:https://www.haomeiwen.com/subject/lmioaqtx.html