分享一下我老师大神的人工智能教程!零基础,通俗易懂!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();
}