上一篇文章中簡單介紹了,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();
}
}
}