反射机制的内存问题

lcs_cs 2007-07-10 05:45:35
问题描述: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;
}
...全文
301 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ochinchina 2007-07-17
  • 打赏
  • 举报
回复
你要写一个clone()函数,比如你得class为Person,那么你的Person可以定义为:

public class Person {
...
public Person() {
}

public Object clone() {
Person p = new Person();
...
return p;
}
}
lcs_cs 2007-07-11
  • 打赏
  • 举报
回复
谢谢,ochinchina,不过我这个obj好像不可以克隆啊,obj=obj.clone();eclipse会提示错误的
请详细说明一下好吗?
ochinchina 2007-07-10
  • 打赏
  • 举报
回复
你的问题很正常,你添加到list中的一直都是参数obj.
解决办法:

1)在生成参数obj的类中定义clone()方法
2)在while(rs.next() ) 添加 obj = obj.clone()

while( rs.next() ) {
obj = obj.clone();
....
}

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧