日期:2014-05-20  浏览次数:20613 次

使用java反射机制封装对象,跪求高手
问题,我也知道出在哪里,是因为把object赋给了低级别的对象,但是我不知道怎么解决;下面给代码,希望能说出完整的解题思路,跪谢!

/*自动封装对象*/
public <T>T getBean(T bean) throws Exception{
try{
conn=super.getCon();
ps=conn.prepareStatement("select * from jdbctest where id=1");
rs=ps.executeQuery();
ResultSetMetaData rsmd=rs.getMetaData(); //找到rs的信息
int cont=rsmd.getColumnCount();//查找出列数
Method[] mh=bean.getClass().getMethods(); //查找出传入对象的所有方法(包括继承的方法)
int i =0;
while(rs.next()) {
//获取列名
String name =rsmd.getColumnLabel(i+1); //找到列名
String colmName="set"+rsmd.getColumnLabel(i+1);
System.out.println("列名"+colmName);
i++;
/*遍历方法,寻找set方法,然后调用*/
for (Method mds : mh) {
if(colmName.equalsIgnoreCase(mds.getName())){
mds.invoke(bean,rs.getObject(name)); //这里接受的对象,切记不能使用 bean.getClass().newInstance(); 因为这个会构造出一个新对象;
}
}
}
return bean;
}finally{
super.closeCon(conn, ps, rs);
}

------解决方案--------------------
根据javabean的规则String colmName="set"+rsmd.getColumnLabel(i+1); 
rsmd.getColumnLabel(i+1)拿到的名称首字母必须大写才是。
同时调用 mds.invoke(bean,rs.getObject(name)),时候必须利用反射对参数类型进行分析在进行转换后调用。
建议用beanutils工具包。
------解决方案--------------------
ResultSet.getObject()
此方法将以 Java 对象的形式返回给定列的值。Java 对象的类型将为与该列的 SQL 类型相对应的默认 Java 对象类型,它遵守在 JDBC 规范中指定的内置类型的映射关系。如果值为 SQL NULL,则驱动程序返回一个 Java null。

你的bean字段与数据库具体的表,在jdbc进行类型映射时出现类型不匹配,因此你可能不能简单地使用getObject()来获得特定字段的值,你需要进一步使用反射分析每个字段的实际定义类型,进而从数据库中使用相应类型的getXXX()方法进行转换,否则就是ClassNotCastException!