java 注解

元注解

元注解主要用于描述注解类

元注解描述
@Target表示该注解用于什么地方。可能的ElementType参数包括:
CONSTRUCTOR: 构造器的声明
FILELD:域声明(包括enum实例)
LOCAL_VARIABLE:局部变量声明
METHOD:方法声明
PACKAGE:包声明
PARAMETER:参数声明
TYPE:类、接口(包括注解类型)或enum声明
@Retention表示需要在什么级别保存该注解信息。可能的RetentionPolicy参数包括:
SOURCE:注解将被编译器丢弃,.java源文件中保留
CLASS:注解在class文件中可用,但会被VM丢弃(运行时不可用)
RUNTIME:VM将在运行期也保留注解,因此可以通过反射机制读取注解信息
@Documented将此注解包含在javadoc中
@Inherited允许子类继承父类中的注解

注解元素可用的类型:

  • 所有基本类型(int、float、boolean)`
  • String
  • Class
  • enum
  • Annotation
  • 以上类型的数组

注解默认值限制:要么有值、要么有默认值,默认值不能为null
没有元素的注解称为标记注解

常见的内置注解

  • @Override:表示当前的方法定义将覆盖超类中的方法
  • @Deprecated:表示注解的目标已被弃用
  • @SuppressWarnings:关闭不当的编译器警告信息

注解使用实例

通过注解动态解析出sql语句,需要实现自定义注意,并且通过注解信息解析出相关的sql

sql约束条件注解

// 约束条件注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Constraints {
    boolean primaryKey() default false;   // 是否主键
    boolean allowNull() default true;   // 是否可为null
    boolean unique() default false;    // 是否唯一
}

数据库表名注解

// 数据库表名注解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface DBTable {
    String name() default "";  // 表名
}

数据库int类型注解

// 数据库int类型注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SQLInteger {
    String name() default "";  // 字段名
    Constraints constraints() default @Constraints; // 字段约束条件描述
}

数据库String类型注解

// 数据库String类型注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SQLString {
    String name() default "";  // 字段名
    int value() default 0;    // 字段默认值
    Constraints constraints() default @Constraints;  // 字段约束条件描
}

使用以上注解描述类

package annotations;
@DBTable(name = "MEMBER") // 表名
public class Member {
    @SQLString(30)
    String firstName;
    @SQLString(50)
    String lastName;  // 表字段lastName
    @SQLInteger Integer age;  // 表字段age
    @SQLString(value = 30,
    constraints = @Constraints(primaryKey = true))
    String handle;
    static int memberCount;
    public String getHandle() { return handle; }
    public String getFirstName() { return firstName; }
    public String getLastName() { return lastName; }
    @Override
    public String toString() { return handle; }
    public Integer getAge() { return age; }
}

当注解只有一个value方法,可以省略掉方法名,如@SQLString(50)等价@SQLString(value = 50)

sql注解的解析器实现,通过注解解析出sql语句

// sql注解处理器
public class TableCreator {
    private static String getConstranints(Constraints con) {
        String constraints = "";
        if (!con.allowNull()) {
            constraints += " NOT NULL";
        }
        if (con.primaryKey()) {
            constraints += " PRIMARY KEY";
        }
        if (con.unique()) {
            constraints += " UNIQUE";
        }
        return constraints;
    }
    public static void main(String[] args) throws Exception {
        String []gs = { "annotations.Member"};
        for (String className : gs) {
            Class<?> cl = Class.forName(className);
            DBTable dbtable = cl.getAnnotation(DBTable.class);
            if (dbtable == null) {
                System.out.println("no 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[] ans = field.getDeclaredAnnotations();
                if (ans.length < 1) {
                    continue;
                }
                if (ans[0] instanceof SQLInteger) {
                    SQLInteger sInt = (SQLInteger) ans[0];
                    if (sInt.name().length() < 1) {
                        columnName = field.getName().toUpperCase();
                    } else {
                        columnName = sInt.name();
                    }
                    columnDefs.add(columnName + " INT" +
                        getConstranints(sInt.constraints()));
                }
                if (ans[0] instanceof SQLString) {
                    SQLString sStr = (SQLString) ans[0];
                    if (sStr.name().length() < 1) {
                        columnName = field.getName().toUpperCase();
                    } else {
                        columnName = sStr.name();
                    }
                    columnDefs.add(columnName + " VARCHAR(" +
                            sStr.value() + ")" +
                            getConstranints(sStr.constraints()));
                }
                StringBuilder builder = new StringBuilder(
                        "CREATE TABLE " + tableName + "(");
                for (String columnDef : columnDefs) {
                    builder.append("\n      " + columnDef + ",");
                }
                String tableCreate = builder.substring(0, builder.length() -1) + ");";
                System.out.println("Table Creation SQL for " +
                        className + " is :\n" + tableCreate);
            }
        }
    }
}
/*output:
Table Creation SQL for annotations.Member is :
CREATE TABLE MEMBER(
      FIRSTNAME VARCHAR(30));
Table Creation SQL for annotations.Member is :
CREATE TABLE MEMBER(
      FIRSTNAME VARCHAR(30),
      LASTNAME VARCHAR(50));
Table Creation SQL for annotations.Member is :
CREATE TABLE MEMBER(
      FIRSTNAME VARCHAR(30),
      LASTNAME VARCHAR(50),
      AGE INT);
Table Creation SQL for annotations.Member is :
CREATE TABLE MEMBER(
      FIRSTNAME VARCHAR(30),
      LASTNAME VARCHAR(50),
      AGE INT,
      HANDLE VARCHAR(30) PRIMARY KEY);
*/



、﹗∕
— 〇 -
╱︱ ヽ
但行好事、莫问前程!
>.freerme[https://blog.csdn.net/freerme]
_________________ *_*______
____ ____ ____
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值