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

teayear
前端领域优质创作者
博客专家认证
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,'水浒传','资料', '在库')

利用反射接收的内容为空?请教中.....
...全文
195 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
单纯的用反射是获取不到参数值的,可以用cglib实现了这个功能

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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