Java反射の一点適用について

1956 ワード

ここには、データベースのヘルプクラスでクエリーの結果をlistに組み立てて返すために使用された小さなアプリケーションを記録します.いいえ、コードを見てください.
public List<Object> getList(String sql,Object[] params,Object obj){
		ResultSet rs = null;
		if(params == null){
		   rs = this.getRs(sql);
		}else{
		   rs = this.getRs(sql, params);
		}
		List<Object> list = new ArrayList<Object>();
		try {
			while(rs.next()){
			int i = 1;
			Object inst =  obj.getClass().newInstance();
			Field[] fields = inst.getClass().getDeclaredFields();
				for(Field field : fields){
					String setStr = field.getName().substring(0, 1).toUpperCase();
					String setMehtodName = "set"+setStr+field.getName().substring(1);
					Method setMethod = obj.getClass().getMethod(setMehtodName, new Class[]{field.getType()});
					setMethod.invoke(inst, new Object[]{rs.getString(i)});
					i++;
				}
				list.add(inst);
			}
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		}
		return list;
		
	}

 ResultSetを取得した後、それをLIST集合にカプセル化し、hibernateで直接取得することができます.もちろん、hibernateでどのように実現されているかは見ていません.私はここでは私の実現にすぎません.いくつかの制限条件が必要です.
1.beanオブジェクトを取得するのはここのinstです.
2.beanオブジェクトを取得するすべてのfieldドメインは、定義されたフィールドです.
3.各フィールドのsetメソッド名を作成する.
4.Resultsetから取り出した結果をBeanオブジェクトにセットする
5.beanオブジェクトをリストセットに入れる
6.return Listコレクション
制限条件:Beanオブジェクトの順序と書かれたクエリー文が検出した各フィールドの順序が一致することを保証します.そうしないと、冠李戴になります.