Java反射機制(未完成,還缺最後一個)

一、背景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();
		}
	}

}

Field 對象的機制與實現

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);
	}

}

Method 對象的機制與實現

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 導入、導出

相關文章
相關標籤/搜索