java 反射 实例化 泛型_java 通过注解和泛型,反射获取泛型,并实例化

packagecom.hwq.reflex;importcom.hwq.annotate.KeyID;importcom.hwq.annotate.TableName;importjava.lang.reflect.Field;importjava.lang.reflect.ParameterizedType;importjava.lang.reflect.Type;importjava.util.ArrayList;importjava.util.List;public class SqlHelper{protected String tableName = null; //表名

protected String id; //主键在 实体类的 名称

protected String key; //主键在 数据库的 名称

protected List fieldList = new ArrayList(); //字段数据

Field[] fieldArr; //反射出来的字段对象,在取值的时候有用

/*** 获取泛型类的方法,由于 JAVA 虚拟机的泛型擦除机制,我们无法获取对应的实体类

* 该方法可以在子类明确表示实体类的情况下,获取到实体类注解以及字段

*@return

*/

private synchronized voidgetTableInfo() {if (tableName == null) {

Type type= this.getClass().getGenericSuperclass();

Type[] typeArr=((ParameterizedType) type).getActualTypeArguments();

Class mtClass = (Class) (typeArr[0]);

TableName table= (TableName) mtClass.getAnnotation(TableName.class); //获取类上 @TableName 注解

tableName =table.value();

fieldArr=mtClass.getDeclaredFields();

List keyList = new ArrayList();

List idList = new ArrayList();for (int i = 0; i < fieldArr.length; i++) {

fieldArr[i].setAccessible(true);

KeyID keyID= fieldArr[i].getAnnotation(KeyID.class); //获取类字段上的 @KeyId 注解

if (keyID != null) {

key=keyID.value();

id=fieldArr[i].getName();

}

fieldList.add(fieldArr[i].getName());//获取类的所有字段

}

}

}/*** 新增的方法*/

public voidsave(T t) {

getTableInfo();

StringBuilder insertSql= new StringBuilder(192);

StringBuilder filedStr= new StringBuilder(64);

StringBuilder valueStr= new StringBuilder(64);

insertSql.append("INSERT INTO ");

insertSql.append(tableName);

filedStr.append(" (");

valueStr.append(" VALUE (");try{for (int i = 0; i < fieldList.size(); i++) {

String field=fieldList.get(i);if (field == id) continue;

filedStr.append(field);

filedStr.append(",");

valueStr.append("'");

valueStr.append(fieldArr[i].get(t));

valueStr.append("',");

}

}catch(Exception ex) {throw newRuntimeException(ex.getMessage());

}

insertSql.append(filedStr.substring(0, filedStr.length() - 1));

insertSql.append(")");

insertSql.append(valueStr.substring(0 ,valueStr.length() - 1));

insertSql.append(")");

String sql=insertSql.toString();

System.out.println(insertSql.toString());

}/*** 编辑的方法,根据主键编辑*/

public voidedit(T t) {

getTableInfo();

StringBuilder updateSql= new StringBuilder(192);

updateSql.append("UPDATE ");

updateSql.append(tableName);

updateSql.append(" SET ");int count = 0;

String idValue= null;try{for (int i = 0; i < fieldList.size(); i++) {

Object value=fieldArr[i].get(t);if (value == null) continue;

String field=fieldList.get(i);if (field ==id) {

idValue=value.toString();

}else{

updateSql.append(field);

updateSql.append("='");

updateSql.append(value);

updateSql.append("',");

count++;

}

}

}catch(Exception ex) {throw newRuntimeException(ex.getMessage());

}if (count == 0 || idValue == null) {throw new RuntimeException("主键为空或实体类没有需要修改的字段");

}

String sql= updateSql.substring(0, updateSql.length() - 1);

sql+= " WHERE " + key + "='" + idValue + "'";

System.out.println(sql);

}/*** 删除的方法,根据主键,单个删除*/

public void removeById(intid) {

getTableInfo();

StringBuilder deleteSql= new StringBuilder(128);

deleteSql.append("DELETE FROM ");

deleteSql.append(tableName);

deleteSql.append(" WHERE ");

deleteSql.append(key);

deleteSql.append("=");

deleteSql.append(id);

String sql=deleteSql.toString();

System.out.println(sql);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值