java 注解总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/minaki_/article/details/86721198

1、 元注解

元注解主要负责注解其他的注解

元注解 描述
@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

2、 java常见的内置注解

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

3、 简单的例子

通过注解解析sql语句

3.1、定义注解类

sql约束条件注解

package annotations;

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;   // 是否可为null
    boolean unique() default false;    // 是否唯一
}

数据库表名注解

package annotations;

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 {
    String name() default "";  // 表名
}

数据库int类型注解

package annotations;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

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

数据库String类型注解

package annotations;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

// 数据库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语句

package annotations;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

// 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);
*/

猜你喜欢

转载自blog.csdn.net/minaki_/article/details/86721198