Java反射機制梳理(二)

        上一篇文章中簡單介紹了,Java反射機制中一些必備的基礎知識。那麼接下來就看看反射機制,在實際開發中的應用場景。這裏採用“通用”的Excel導入導出作爲demo。至於引用的這個例子,其實是模仿極客學院中的例子來寫的。

        1.Excel的導出,在未知對象的類型的時候,我們可以通過反射獲取傳遞過來對象中的所有屬性。每一個屬性(Field)其實就是對於Excel的列。而集合的大小,其實就是對於每一行的數據。現在知道行和列了。那麼就可以進行單元格的創建,並且將對於的信息填寫到單元格中。

  

 /**
	 * Excel導出工具類
	 * 
	 * @param ar
	 * @param path
	 */
	public static void ExcelOut(ArrayList ar, String path) {
		WritableWorkbook mWorkbook = null;
		try {
			mWorkbook = Workbook.createWorkbook(new File(path));
			WritableSheet mSheet = mWorkbook.createSheet("sheet1", 0);
			// ar.size()爲集合有多少行。i間接代表行數
			for (int i = 0; i < ar.size(); i++) {
				Object ob = ar.get(i);
				// 獲取類對象
				Class cl = ob.getClass();
				// 獲取對象的所有屬性
				Field[] fi = cl.getDeclaredFields();
				// 遍歷所有的參數,其實j也就是對於的列數
				for (int j = 0; j < fi.length; j++) {
					// 設置對私有屬性可操作
					fi[j].setAccessible(true);
					Label mLable = new Label(j, i,
							String.valueOf(fi[j].get(ob)));
					mSheet.addCell(mLable);
				}
			}
			mWorkbook.write();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {<pre name="code" class="java">

         2.Excel的導入,對於導入,其實和導出有着很多的相似之處。這裏傳入的是已知的對象,那麼我們可以通過反射,調用方法cl.newInstance()對傳入的對象進行實例化。獲取傳入對象的屬性,以及Excel對應的行數,利用兩個循環可以獲取到對應屬性的值。使用getType()的方法,判斷屬性的類型,通過set方法對屬性設值。這樣就可以設置每一個屬性對應的值。文筆有限,具體可以以一下代碼:

/**
	 * Excel導入工具類
	 * 
	 * @param <T>
	 * @return
	 */
	public static ArrayList excelIn(Class cl, String path) {
		Workbook mWorkbook = null;
		ArrayList ar = new ArrayList();
		try {
			mWorkbook = Workbook.getWorkbook(new File(path));
			Sheet mSheet = mWorkbook.getSheet(0);
			Field[] fi = cl.getDeclaredFields();
			for (int i = 0; i < mSheet.getRows(); i++) {
				Object ob = cl.newInstance();
				for (int j = 0; j < fi.length; j++) {
					fi[j].setAccessible(true);
					//獲取對象的類型,這裏做測試使用,只是寫了幾種類型,具體可以完善。  
					if (fi[j].getType().toString().equals("class java.lang.String")) {
						fi[j].set(ob, mSheet.getCell(j, i).getContents());
					} else if (fi[j].getType().toString().equals("int")) {
						fi[j].setInt(ob, Integer.valueOf(mSheet.getCell(j, i)
								.getContents()));
					} else if (fi[j].getType().toString().equals("double")) {
						fi[j].setDouble(ob, Double.valueOf(mSheet.getCell(j, i)
								.getContents()));
					} else if (fi[j].getType().toString().equals("float")) {
						fi[j].setFloat(ob, Float.valueOf(mSheet.getCell(j, i)
								.getContents()));
					}
				}
				ar.add(ob);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			mWorkbook.close();
		}
		return ar;
	}


			try {
				mWorkbook.close();
			} catch (WriteException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}     



       源碼下載



  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章