场景
注解的实用,当然是为了让我们的代码更具有扩展性, 更加的高大上, 例如将 数据库表与对象添加注解,进行对应.
例如: 我们可以直接将一条半结构化数据经过处理放到hbase数据库中,但是这样的话,如果列非常多的情况,我们的代码也要很长,但是实用注解配合反射的用法,可以提高扩展性,在数据量大,列多的情况,可以简化我们的代码
代码: 自定义注解:
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
String family() default "info";
String column() default "";
}
public void insertDatas(String data) throws Exception{
String[] split = data.split("\t");
String call1=split[0];
String call2=split[1];
String callTime=split[2];
String duration=split[3];
String rowkey=getPartitionNum(call1,callTime)+"_"+call1+"_"+call2+"_"+callTime+"_"+duration;
Put put = new Put( rowkey.getBytes());
put.addColumn(Names.CF_CALLER.value().getBytes(), Bytes.toBytes("call1"),Bytes.toBytes(call1));
put.addColumn(Names.CF_CALLER.value().getBytes(), Bytes.toBytes("call2"),Bytes.toBytes(call2));
put.addColumn(Names.CF_CALLER.value().getBytes(), Bytes.toBytes("callTime"),Bytes.toBytes(callTime));
put.addColumn(Names.CF_CALLER.value().getBytes(), Bytes.toBytes("duration"),Bytes.toBytes(duration));
putData(put);
}
注解+反射的方式: 这样的话,只需要添加相应的注解,再用反射进行获取值就ok了! (虽然看起来可能比较麻烦)
protected void putData(Object obj) throws Exception{
Class clazz = obj.getClass();
com.dxy.common.api.TableName annotation = (com.dxy.common.api.TableName)clazz.getAnnotation(com.dxy.common.api.TableName.class);
String tableName = annotation.value();
Connection connection = getConnection();
Table connectionTable = connection.getTable(TableName.valueOf(tableName));
String rowkey="";
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
Rowkey rowkeyAnno = field.getAnnotation(Rowkey.class);
if(rowkeyAnno != null){
field.setAccessible(true);
rowkey = (String)field.get(obj);
}
}
Put put=new Put(rowkey.getBytes());
for (Field field : fields) {
Column columnAn = field.getAnnotation(Column.class);
if(columnAn!= null){
String family = columnAn.family();
String column = columnAn.column();
if(column == null || column.equals("")){
column = field.getName();
}
field.setAccessible(true);
String value=(String) field.get(obj);
put.addColumn(Bytes.toBytes(family),Bytes.toBytes( column),Bytes.toBytes(value));
}
}
connectionTable.put(put);
connectionTable.close();
}
|