Java 使用annotation注解 - (一)

      在使用Java快4年的时间了 是时候应该留下点东西了。今天又在写实体类 pojo 感觉一直在写 一直在使用mybatis的注解 spring的注解 今天就看看源码里面是怎么定义的。 可以关注我的新浪微博 : 疯狂的杨中仁

首先要研究注解 我只记得annotation 以及基本的用法 public @interface ****{}

在网上找了一些资料 看了再上面定义@Documented说明是这个是注解 然后在@Documented这个注解下面 我们看到了

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}

看基本的意思就是

@Retention(RetentionPolicy.RUNTIME) 就是在上面时候运行 

@Target(ElementType.ANNOTATION_TYPE) 这个注解的意思就是 在上面类型上面运行。

那么我们就使用这个原注解上面的3个注解 模仿hibernate写一个 

定义一个Table注解 自己的额

首先定义一个数据库类型的枚举

public enum DBEnum {

	// 定义数据库枚举 2015年5月17日22:41:47
	MYSQL, ORACLE, MSSQL, DB2, SYBASE

}

接着定义一个Table注解

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

	public String value() default ""; // 使用表的名称
	
	// 定义数据库枚举
	public DBEnum type() default DBEnum.MSSQL; // 默认使用mysql数据库
}

在下面定义Column注解

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

	// 使用数据库的列的名称
	public String value() default ""; // 默认使用‘’
	
}

一张表下面必须要有的还有id 在做保存的时候 必须的 呵呵 下面增加一个ID注解

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

	// 在列上面使用id注解 说明这个列是id列 在做保存的时候 使用自己增加的策略 2015年5月17日22:44:43
	public boolean unique() default false; // 使用唯一的约束 2015年5月17日22:46:43

}

注解定义好了 那么下面 我们是要写一个实体类 也就是pojo

public class User {

	@ID
	@Column
	private int userid;
	
	@Column
	private String username;
	
	@Column
	private String password;
	
	@Column
	private String createtime;
	
	@Column
	private String updatetime;
	
	@Column
	private String telephone;
	
	@Column
	private int status;
	
	@Column
	private String nickname;
	
	@Column
	private int integral;

	public int getUserid() {
		return userid;
	}

	public void setUserid(int userid) {
		this.userid = userid;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getCreatetime() {
		return createtime;
	}

	public void setCreatetime(String createtime) {
		this.createtime = createtime;
	}

	public String getUpdatetime() {
		return updatetime;
	}

	public void setUpdatetime(String updatetime) {
		this.updatetime = updatetime;
	}

	public String getTelephone() {
		return telephone;
	}

	public void setTelephone(String telephone) {
		this.telephone = telephone;
	}

	public int getStatus() {
		return status;
	}

	public void setStatus(int status) {
		this.status = status;
	}

	public String getNickname() {
		return nickname;
	}

	public void setNickname(String nickname) {
		this.nickname = nickname;
	}

	public int getIntegral() {
		return integral;
	}

	public void setIntegral(int integral) {
		this.integral = integral;
	}

}

记得在上面增加上我们之前定义好的注解 


下面我们就可以在下面解析这个注解  直接上代码吧  有什么不懂的可以在下面评论额

public class AplasMain {
	
	
	// 测试方法 2015年5月17日22:32:23
	public static void main(String[] args) throws Exception {
		
		// 定义一个user类型 反射这个类型下面所有的字段
		Map<String, Object> map = new HashMap<String, Object>();
		Class<? extends Object> clazz = User.class;
		
		map.put("className", clazz.getSimpleName());
		map.put("tableName", clazz.getSimpleName());
		
		// 判断 如果类型使用了Table注解
		if (clazz.isAnnotationPresent(Table.class)) {
			Table table = clazz.getAnnotation(Table.class);
			if (table!=null && !table.value().equals("")) { // 默认值设置的是“” 所以直接判断是否是""就可以
				map.put("tableName", table.value());
			}
		}
		
		//拿出这个类型下面所有的字段
		Field[] fields = clazz.getDeclaredFields();
		// 判断下面的字段
		List<Map<String, Object>> mapList = new ArrayList<Map<String,Object>>();
		for (Field field : fields) {
			Map<String, Object> fieldMap = new HashMap<String, Object>();
			fieldMap.put("property", field.getName());
			fieldMap.put("column", field.getName());
			fieldMap.put("unique", false);
			// 判断是否使用了column注解
			if (field.isAnnotationPresent(Column.class)) {
				Column column = field.getAnnotation(Column.class);
				if (column!=null && !column.value().equals("")) {
					fieldMap.put("column", column.value());
				}
			}
			// 判断是否使用id注解
			if (field.isAnnotationPresent(ID.class)) {
				ID id = field.getAnnotation(ID.class);
				if (id!=null && !id.unique()) {
					fieldMap.put("unique", true);
				}
			}
			// 最后把这个放在list下面
			mapList.add(fieldMap);
		}
		
		map.put("list", mapList);
		
		// 打印成json的 看下结果
		System.out.println(JSONArray.fromObject(map));
	}
	
	
}

最后看一下输出的结果 

[
    {
        "tableName": "User",
        "list": [
            {
                "unique": true,
                "column": "userid",
                "property": "userid"
            },
            {
                "unique": false,
                "column": "username",
                "property": "username"
            },
            {
                "unique": false,
                "column": "password",
                "property": "password"
            },
            {
                "unique": false,
                "column": "createtime",
                "property": "createtime"
            },
            {
                "unique": false,
                "column": "updatetime",
                "property": "updatetime"
            },
            {
                "unique": false,
                "column": "telephone",
                "property": "telephone"
            },
            {
                "unique": false,
                "column": "status",
                "property": "status"
            },
            {
                "unique": false,
                "column": "nickname",
                "property": "nickname"
            },
            {
                "unique": false,
                "column": "integral",
                "property": "integral"
            }
        ],
        "className": "User"
    }
]

是我们想要的结果 说明解析出来是对的。

下面一篇文章讲讲解annotation的原理。谢谢关注 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。