java反射机制的使用_浅探JAVA反射机制的使用

1. 什么是反射?

反射主要是指程序可以访问,检测和修改它本身的状态或行为的一种能力。

初读概念可能难以知道反射有什么作用。那我们接着往下看。

2.  反射有何用途?

Java中的反射是一种强大的工具,它能够创建灵活的代码,这些代码可以在运行时装配,无须在组件之间进行链接。

当我们从数据库中查询数据,并返回了一个ResultSet,但我们需要将ResultSet中的数据转成我们需要的List形式。常规的做法是遍历ResultSet,并在遍历体中将值赋给List。若是我们的数据表较少,并且查询的字段也足够少,我们勉强能接受这种“笨”方法。若是表很多并且一张表中有多达三四十个字段呢?那我们得写多少遍历?一个遍历中得写多少类似于rs.getXX("字段名")这样的代码?

我们既然知道数据库中返回的是什么字段,并且基本与我们的某个实体类属性相吻合,我们能否让他们自己去匹配呢?

答案当然是可以的,我们用JAVA的反射机制就可以实现这一功能。用反射创建灵活的代码!

我们需要一个可以在运行时将ResultSet中的一行结果与我们的目标实体类相互匹配,将相匹配的字段自动从当前ResultSet行填充到实体类中,若字段名不匹配则跳过,并依次循环添加到List中。这样我们就可以运用反射功能完成数据的自动填充。

我们对ResultSet进行遍历并将他的列明存入一个List:

/**

* 获取ResultSet各列名

*

* @param rs

* @return

* @throws SQLException

*/

private List getColumnNames(ResultSet rs) throws SQLException {

int count = rs.getMetaData().getColumnCount();

// String[] columnName = new String[count];

List columnName = new ArrayList<>();

for (int i = 1; i <= count; i++) {

columnName.add(rs.getMetaData().getColumnName(i));

}

return columnName;

}

接下来我们需要用ResultSet的列名与我们需要返回的实体类属性相匹配,已知实体类类名XX.getClass(),需要返回什么类型我们不知道,用泛型T来代替。方法申明如下:

public List toList(ResultSet rs, Class clazz)

获取T类型字段:

try {

t = clazz.newInstance();

} catch (InstantiationException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

// 获取T类型各字段

Field[] t_fields = t.getClass().getDeclaredFields();

那么ResultSet的各列名与目标实体类属性我们都已经获取到了,接下来让他们两辆配对,两两配对我们必定要用到循环嵌套:

for (Field field : t_fields) {

fieldName = field.getName();

Method method;

for (String columnName : columnNames) {

if (columnName.toLowerCase().equals(

fieldName.toLowerCase())) {

if (rs.getObject(columnName) != null) {

String setMethodName = getMethodName(fieldName);

method = t.getClass().getDeclaredMethod(

setMethodName, field.getType());

method.invoke(

t,

convertDataType(field.getType(), rs

.getObject(field.getName())

.toString()));

}

columnNames.remove(columnName);

break;

}

}

if (columnNames.size() == 0) {

break;

}

}

比较的时候注意大小写同步,如果已经匹配成功,我们则要将ResultSet行中对应列名的值赋值给实体类t,此时我们需要能访问t的setter方法来赋值,已知属性名查询对应set方法名:

/**

* 查询方法名

*

* @param fieldName

* @return

*/

private String getMethodName(String fieldName) {

String methodName = "set" + fieldName.substring(0, 1).toUpperCase()

+ fieldName.substring(1);

return methodName;

}

方法名知道了我们还需要去获取到这个方法:

Method method = t.getClass().getDeclaredMethod(setMethodName, field.getType());

Method我们已经获取成功了,接下来就是最后一部通过set方法给实体类赋值了:

method.invoke(t,convertDataType(field.getType(), rs.getObject(field.getName()).toString()));

至此我们通过反射来给实体类赋值就结束了。

有兴趣的可以去查询下反射类的API,主要从以下几个类获取方法:

import java.lang.reflect.Field;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

完整类代码链接:http://download.csdn.net/detail/wang124454731/9457303

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值