反射机制的内存问题
问题描述:1.通过查询得到数据中符合条件的记录,2.然后通过反射机制把没个记录的字段值付给对象,3.然后把对象添加到List中,4.然后把这个list返回给用户。
现在的问题:1,2,3,4运行都正常,可是到3中添加后得出来的list的每一个对象都是同一个对象,导致返回给用户的也是同一个对象,如何解决第三步
/**
* 类名:query 实现任意查找
*
* @param obj
* 查找对应的类
* @param sql
* 查找的语句
* @Retrun 返回list列表,存放所有符合条件的类
* @Exception 如果有错误返回异常
*/
public List query(Object obj, String sql)
{
// all用来存储所以符合条件的对象
List all = new ArrayList();
int methodLen = 0;
String methodName = "";
String columnName = "";
// 得到方法名称的集合
Method[] method = obj.getClass().getDeclaredMethods();
methodLen = method.length;
try
{
// 执行查询操作
System.out.println("Begin to query!!");
st = connection.createStatement();
ResultSet rs = st.executeQuery(sql);
while (rs.next())
{
// 循环得到每一条记录,并把每一条记录生成一个对象后添加到all中
for (int i = 0; i < methodLen; i++)
{
// 得到方法的名称
methodName = method[i].getName();
// 我们值处理setter方法
if (methodName.startsWith("set"))
{
// 得到每个字段的名字
columnName = StringUtil.tolowerFirstLetter(methodName
.substring(3));
try
{
// 设置setter方法的参数
Object[] parameter = new Object[1];
String parameterType = method[i]
.getParameterTypes()[0].getName();
// 对int类型,string类型进行了操作
// 我们没有对其他类型进行处理,如果需要可以修改下面的if语句
if (parameterType.equals("int"))
{
parameter[0] = new Integer(rs
.getInt(columnName));
// System.out.println(rs.getInt(columnName));
}
else
{
parameter[0] = new String(rs
.getString(columnName));
// System.out.println(rs.getString(columnName));
}
// 调用invoke方法实现setter方法的赋值
method[i].invoke(obj, parameter);
// System.out.println(columnName);
}
catch (Exception e)
{
throw new Exception("操作异常!!");
}
}
}
// 将对象添加到all(list类型)中
Person p = (Person)obj;
System.out.println(p.getName());
Object addObj = new Object();
addObj = obj;
// 之前的没有问题,就是all.add这个地方有问题
all.add(addObj);
// System.out.println(all.size());
}
}
catch (Exception e)
{
e.printStackTrace();
}
Iterator it = all.iterator();
while (it.hasNext())
{
Person p = (Person) it.next();
System.out.println(p.getName());
}
System.out.println("Finish to query!!");
return all;
}