反射为什么没有接收内容呢?

tea_year 2014-08-12 01:12:16
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;


public class MetaDataRef<T> {
/**
* 泛型查询
* @param sql SQL语句
* @param args 查询语句的参数
* @param ClassName 类的完全限定名;
* @return
* */
public List<T> generalSearch(String sql,Object[]args,String className){
//存储返回的集合对象;
List<T>list=new ArrayList<T>();

Connection conn=DaoFactory.getConnection();
PreparedStatement pstmt=null;
ResultSet rs=null;

try{
//使用反射获取类的相关信息
Class<T>clazz=(Class<T>)Class.forName(className);
Field[]fields=clazz.getDeclaredFields();
Method method=null;

pstmt=conn.prepareStatement(sql);
rs=pstmt.executeQuery();
ResultSetMetaData resmd=null;
//获取结果集的元数据;
resmd=rs.getMetaData();
//获取一共多少列;
int columnCount=resmd.getColumnCount();
//获取输出列的名称;
while(rs.next()){
T obj=clazz.newInstance(); //创建一个新对象;
for(int i=1;i<=columnCount;i++){
String cname=resmd.getColumnClassName(i); //获取每一列的名称;
int cType=resmd.getColumnType(i); //获取每一列的类型;
for(Field f:fields){//循环实体类的实列
if(cname.equals(f.getName())) //如果列名和属性名相同;
{
//封装数据;
String firstLetter=f.getName().substring(0,1).toUpperCase();
String methodName="set"+firstLetter+f.getName().substring(1);
//如果列是整型的
if(cType==Types.INTEGER){
method=clazz.getMethod(methodName, Integer.class);
method.invoke(obj,rs.getInt(i));
}else if(cType==Types.VARCHAR){
method=clazz.getMethod(methodName, String.class);
method.invoke(obj,rs.getString(i));
}else if(cType==Types.TIMESTAMP){
method=clazz.getMethod(methodName, Date.class);
method.invoke(methodName,rs.getDate(i));
}else if(cType==Types.NUMERIC){
method=clazz.getMethod(methodName, Double.class);
method.invoke(obj,rs.getDouble(i));
}
}
}
}
list.add(obj);
}
}catch(Exception e){
e.printStackTrace();
}
return list;
}
}


////
import java.util.List;


public class TestFlec {

/**
* @param args
*/
public static void main(String[] args) {
String sql="select * from bookinfo";
MetaDataRef<Book>mdt=new MetaDataRef<Book>();
System.out.println(mdt);
List<Book>list=mdt.generalSearch(sql,null,Book.class.getName());
System.out.println("Id Name Type Status");
System.out.println(Book.class.getName());
for(Book book:list){
System.out.println(book.getId()+"\t"+book.getName()+"\t"+book.getType()+"\t"+book.getStatus());

}
}
}



表;
create table bookInfo(
BOOKID Number(6) PRIMARY KEY,
BOOKNAME VARCHAR2(50) NOT NULL,
BOOKTYPE VARCHAR2(50) NOT NULL,
BOOKSTATUS VARCHAR2(10))
----
INSERT INTO bookInfo VALUES(1,'JAVA基础','资料', '借出')
INSERT INTO bookInfo VALUES(2,'C#逻辑','资料', '借出')
INSERT INTO bookInfo VALUES(3,'java面向对象','资料', '借出')
INSERT INTO bookInfo VALUES(4,'三层架构','资料', '在库')
INSERT INTO bookInfo VALUES(5,'jsp宝典','资料', '在库')
INSERT INTO bookInfo VALUES(6,'Ecalipse资料','资料', '借出')
INSERT INTO bookInfo VALUES(7,'siasd','资料', '借出')
INSERT INTO bookInfo VALUES(8,'Js脚本','资料', '在库')
INSERT INTO bookInfo VALUES(9,'项目演练','资料', '在库')
INSERT INTO bookInfo VALUES(10,'三国演义','小说', '借出')
INSERT INTO bookInfo VALUES(11,'水浒传','资料', '在库')

利用反射接收的内容为空?请教中.....
...全文
110 点赞 收藏 1
写回复
1 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
单纯的用反射是获取不到参数值的,可以用cglib实现了这个功能
回复
发帖
Java SE
创建于2007-09-28

6.1w+

社区成员

Java 2 Standard Edition
申请成为版主
帖子事件
创建了帖子
2014-08-12 01:12
社区公告
暂无公告