一、背景html
1)Reflection也就是反射 是Java被視爲動態(或準動態)語言的一個關鍵性質
java
2)反射機制指的是程序在運行時可以獲取任何類的內部全部信息
框架
二、實現功能概述eclipse
1)只要給定類的全名,便可經過反射獲取類的全部信息。
this
2)反射能夠在程序運行時獲取任意一個對象所屬的類對象。
spa
3)在運行時能夠獲取到類中全部屬性對象,並對其操做(包括私有屬性)。
excel
4)在運行時能夠獲取到類中,父類中全部方法,並調用。
code
5)目前主流的應用框架如Struts2,Hibernate,Spring,SpringMVC等框架的核心所有是利用Java的反射機制來實現的。
htm
Class對象的機制與實現對象
一、Class對象概述
1)Class其實就是類的類型
2)字符串類型就是String,整形類型就是Integer,String和Integer類型就是Class
二、Class對象的經常使用方法介紹
newInstance() 實例化對象
三、實例化對象的三種方式
JavaBean
public class Book { private int id; private String name; public String type; /** * @return the id */ public int getId() { return id; } /** * @param id the id to set */ public void setId(int id) { this.id = id; } /** * @return the name */ public String getName() { return name; } /** * @param name the name to set */ public void setName(String name) { this.name = name; } /** * @return the type */ public String getType() { return type; } /** * @param type the type to set */ public void setType(String type) { this.type = type; } }
package main; import bean.Book; public class Test1 { public static void main(String[] args) { // TODO Auto-generated method stub Class demo1=null; Class demo2=null; Class demo3=null; //實例化對象的第一種方式 try{ demo1=Class.forName("bean.Book"); }catch(Exception e){ e.printStackTrace(); } System.out.println(demo1); //實例化對象的第二種方式 Book bo=new Book(); Object ob=bo; System.out.println("第二種"+ob.getClass()); //實例化對象的第三種方式 demo3=Book.class; System.out.println("第三種"+demo3); // try { Book bo1=(Book)demo3.newInstance(); System.out.println("實例化後的類對象:"+bo1); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
package main; import java.lang.reflect.Field; import bean.Book; public class FieldTest { //該方法用於使用傳遞過來的Class對象獲取類中的屬性 public void show(Class c1){ Field[] fi=c1.getDeclaredFields(); //{能夠將私有屬性獲取到} getDeclaredFields()獲取類中的全部屬性 for(Field ff:fi){ System.out.println(ff.getName()); System.out.println(ff.getType()); } System.out.println("~~~~~~~~~~~~~~~~~"); Field[] fi1=c1.getFields(); //只能夠獲取到公有屬性 for(Field ff1:fi1){ System.out.println(ff1.getName()); System.out.println(ff1.getType()); } System.out.println("~~~~~~~~~~~~~~~~~"); } //該方法用於使用傳遞過來的實體類對象 獲取屬性以及屬性的值 public void show(Object ob){ Class c1=ob.getClass(); Field[] fi=c1.getDeclaredFields(); for(Field ff:fi){ try { ff.setAccessible(true); System.out.println(ff.getName()+":"+ff.get(ob)); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static void main(String[] args) { // TODO Auto-generated method stub Book bo=new Book(); bo.setId(1); bo.setName("傾城之戀"); bo.setType("文學"); FieldTest ft=new FieldTest(); ft.show(Book.class); Book oob=new Book(); oob.setId(2); oob.setName("那年夏天"); oob.setType("文學"); FieldTest ft1=new FieldTest(); ft1.show(oob); } }
getDeclaredAnnotations() 獲取方法的所有註解
package main; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import bean.Book; public class MethodTest { //該方法用於獲取對象的全部方法名稱、返回值類型、以及參數信息 public void show(Object ob){ Class c2=ob.getClass(); Method[] mt=c2.getDeclaredMethods(); for(Method mm:mt){ System.out.println("方法名稱:"+mm.getName()); System.out.println("方法修飾符"+Modifier.toString(mm.getModifiers())); System.out.println("方法返回值類型"+mm.getReturnType()); System.out.println("方法參數列表"); Class[] preType=mm.getParameterTypes(); for(Class c21:preType){ System.out.println(c21.getName()); } } } public static void main(String[] args) { // TODO Auto-generated method stub Book bk=new Book(); bk.setId(3); bk.setName("我和鳳姐居住的日子"); bk.setType("驚悚"); MethodTest mt=new MethodTest(); mt.show(bk); } }
package main; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import bean.Book; public class MethodTest { //該方法用於獲取對象的全部方法名稱、返回值類型、以及參數信息 public void show(Object ob){ Class c2=ob.getClass(); Method[] mt=c2.getDeclaredMethods(); for(Method mm:mt){ System.out.println("方法名稱:"+mm.getName()); System.out.println("方法修飾符"+Modifier.toString(mm.getModifiers())); System.out.println("方法返回值類型"+mm.getReturnType()); System.out.println("方法參數列表"); Class[] preType=mm.getParameterTypes(); for(Class c21:preType){ System.out.println(c21.getName()); } } } //該方法用於使用傳遞過來的實體對象 獲取其中的方法 並調用 public void showUse(Object ob){ Class c1=ob.getClass(); try { Method me=c1.getMethod("getName", null); try { me.invoke(ob, new Object[0]); } catch (IllegalAccessException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } Method me1=c1.getMethod("setName", String.class); try { me1.invoke(ob, "嘻遊記"); Class[] c4={String.class,int.class}; Method me2=c1.getMethod("test", c4); Object[] obb={"哈哈",12}; me2.invoke(ob, obb); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { // TODO Auto-generated method stub Book bk=new Book(); bk.setId(3); bk.setName("我和鳳姐居住的日子"); bk.setType("驚悚"); //MethodTest mt=new MethodTest(); //mt.show(bk); MethodTest mte=new MethodTest(); mte.showUse(bk); System.out.println(bk.getName()); } }
Excel 導入、導出的實現
package main2; import java.io.File; import java.io.IOException; import java.util.ArrayList; import bean2.Book; import jxl.Workbook; import jxl.write.Label; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook; import jxl.write.WriteException; import jxl.write.biff.RowsExceededException; public class ExcelDemo01 { public void excelOut(){ WritableWorkbook book=null;//Excle對象 try { //建立excle對象 book=Workbook.createWorkbook(new File("D:/eclipse/workspace/excel/book.xls")); //經過excle對象建立一個選項卡對象 WritableSheet sheet=book.createSheet("sheet1", 0); //建立一個單元格對象 列 行 值 Label la=new Label(0,2,"test"); //將建立好的單元格對象放入選項卡中 try { sheet.addCell(la); } catch (RowsExceededException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (WriteException e) { // TODO Auto-generated catch block e.printStackTrace(); } //寫入目標路徑 book.write(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { book.close(); } catch (WriteException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static void main(String[] args) { // TODO Auto-generated method stub ExcelDemo01 eb=new ExcelDemo01(); eb.excelOut(); } }
package main2; import java.io.File; import java.io.IOException; import java.util.ArrayList; import bean2.Book; import jxl.Workbook; import jxl.write.Label; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook; import jxl.write.WriteException; import jxl.write.biff.RowsExceededException; public class ExcelDemo01 { public void excelOut(ArrayList ar){ WritableWorkbook book=null;//Excle對象 try { //建立excle對象 book=Workbook.createWorkbook(new File("D:/eclipse/workspace/excel/book.xls")); //經過excle對象建立一個選項卡對象 WritableSheet sheet=book.createSheet("sheet1", 0); //建立一個單元格對象 列 行 值 for(int i=0;i<ar.size();i++){ Book bo=(Book) ar.get(i); Label la1=new Label(0,i,String.valueOf(bo.getId())); Label la2=new Label(1,i,bo.getName()); Label la3=new Label(2,i,bo.getType()); sheet.addCell(la1); sheet.addCell(la2); sheet.addCell(la3); } book.write(); }catch (RowsExceededException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (WriteException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { book.close(); } catch (WriteException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static void main(String[] args) { // TODO Auto-generated method stub ExcelDemo01 eb=new ExcelDemo01(); ArrayList<Book> ar=new ArrayList<Book>(); Book bo=new Book(); bo.setId(1); bo.setName("月子"); bo.setType("生活"); Book bo2=new Book(); bo2.setId(2); bo2.setName("月子"); bo2.setType("生活"); Book bo3=new Book(); bo3.setId(3); bo3.setName("月子"); bo3.setType("生活"); ar.add(bo); ar.add(bo2); ar.add(bo3); eb.excelOut(ar); } }
package main2; import java.io.File; import java.io.IOException; import java.util.ArrayList; import bean2.Book; import jxl.Cell; import jxl.Sheet; import jxl.Workbook; import jxl.read.biff.BiffException; import jxl.write.Label; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook; import jxl.write.WriteException; import jxl.write.biff.RowsExceededException; public class ExcelDemo01 { public ArrayList<Book> excleIn(){ ArrayList<Book> ar=new ArrayList<Book>(); Workbook book=null; try { //獲取到excle對象 book=Workbook.getWorkbook(new File("D:/eclipse/workspace/excel/book.xls")); Sheet sheet=book.getSheet(0); for(int i=0;i<sheet.getRows();i++){ Book bo=new Book(); Cell cell=sheet.getCell(0,i); bo.setId(Integer.valueOf(cell.getContents())); bo.setName(sheet.getCell(1,i).getContents()); bo.setType(sheet.getCell(2,0).getContents()); ar.add(bo); } } catch (BiffException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ book.close(); } return ar; } public static void main(String[] args) { // TODO Auto-generated method stub ExcelDemo01 eb=new ExcelDemo01(); ArrayList<Book> ar1=eb.excleIn(); for(Book bo2:ar1){ System.out.println(bo2.getName()+bo2.getType()); } } }
利用反射實現通用 Excel 導入、導出