Java进阶(六)Java反射机制可恶问题NoSuchFieldException

本文探讨了Java反射机制中的NoSuchFieldException问题,通过实例代码展示了如何使用反射生成对象、访问成员变量,并提供了相关应用示例。文章强调了深入理解反射机制的重要性,以解决实际开发中遇到的问题。
摘要由CSDN通过智能技术生成

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

作为一种重要特性,Java反射机制在很多地方会用到。在此做一小结,供朋友们参考。

首先从一个问题开始着手。

可恶的问题又来了,NoSuchFieldException,如下图所示:

 

完全不知道这个question是从哪里来的。以前也遇到过这样的问题,后来解决了,但是没有写文档,再次相遇这样的问题,傻了。

经过上网一番查找,发现遇到这个问题的小盆友还真不少,这个问题是属于java反射机制里的。

这是一个反射对象时候的异常,已经被捕获了的。这个报错代码是混淆了的,是不是这个question对象被混淆成其他名了。。

源代码如下:

public static <T> List<T> findMoreRefResult(String sql, List<Object> params,

Class<T> cls) throws Exception {

 

//加载数据库驱动

new MysqlUtil();

//连接数据库

MysqlUtil.GetConnection();

// 构造一个初始容量为 10 的空列表。

List<T> list = new ArrayList<T>();

 

// 表示占位符的第一个位置

int index = 1;

 

pstmt = connection.prepareStatement(sql);

 

System.out.println("MysqlUtil:" + params);

// 判断所填充的占位符是否有值;判断集合的标准方式

if (params != null && !params.isEmpty()) {

for (int i = 0; i < params.size(); i++) {

 

// 使用给定对象设置指定参数的值。第二个参数必须是Object类型

pstmt.setObject(index++, params.get(i));

 

}

}

 

// 返回查询结果

resultset = pstmt.executeQuery();

// 获取列的相关信息

java.sql.ResultSetMetaData metdata = resultset.getMetaData();

 

// 获取列数

int col_lenth = metdata.getColumnCount();

while (resultset.next()) {

 

// 通过反射机制创建一个实例(生成对象)

T resultObject = cls.newInstance();

for (int i = 0; i < col_lenth; i++) {

String cols_name = metdata.getColumnName(i + 1);

Object cols_value = resultset.getObject(cols_name);

if (cols_value == null) {

cols_value = "";

}

 

// 通过字段名获得反射(返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段)

Field field = cls.getDeclaredField(cols_name);

 

// 打开javabean的私有访问权限

field.setAccessible(true);

field.set(resultObject, cols_value);

}

list.add(resultObject);

}

 

//关闭数据库

MysqlUtil.releaseConn();

return list;

}

调用以上方法的方法如下:

public static void main(String[] args) {

//Question question = new Question();

//

//Field property = null;

//try {

//property = question.getClass().getDeclaredField("description");

//} catch (NoSuchFieldException e1) {

//e1.printStackTrace();

//} catch (SecurityException e1) {

//e1.printStackTrace();

//}

//        System.out.println(property);

List<Object> params = new ArrayList<Object>();

String sql = "SELECT * FROM question ";

try {

System.out.println(MysqlUtil.findMoreRefResult(sql, params, Question.class));

} catch (Exception e) {

e.printStackTrace();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值