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