在使用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的原理。谢谢关注
原文:http://my.oschina.net/superman158/blog/416020