程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java中反射機制詳解

Java中反射機制詳解

編輯:關於JAVA

反射:

可以動態的獲取指定類中的成員,以及建立類對象。

好處:提高了程序的擴展性。

張三,李四等這些生活中的對象,可以通過Person類的形式對其進行描述。

當class文件產生以後,這些class文件也是生活中的事物,那麼對這些class文件也可以進行描述,該描述對應的類型就是Class。

在Java中,每一個字節碼文件都有一一個與之對應的Class對象。不僅包括引用數據類型,也包括基本數據類型。int.Class

  1. String.class----Class
  2. Class class1=String.class;
  3. String s="abc";
  4. Class class2=s.getClass();
  5. Class class3 = Class.forName("Java.lang.String");

以上就是獲取字節碼文件的三種方式。

以前操作對象的時候用的是new關鍵字完成,並通過對象.成員方式進行調用

  1. Person p= new Person();
  2. //1.光加載Person.class文件。
  3. //2.對對象進行初始化。
  4. p.function("heihei");
  5. //在對象調用成員方法時,需要明確兩個因素:
  6. 1.對象 2.獲取參數列表

現在可以通過字節碼對象完成以上動作。

  1. //加載Person.class文件,獲取Person.class文件對象的Class對象
  2. Class clazz = Class.forName("Person");
  3. //通過字節碼文件對象,對指定類進行創建並初始化。
  4. Person p=(Person)clazz.newInstance();
  5. //通過對象調用成員
  6. //p.function("heihei");

類可以作為參數進行傳遞,那麼方法也一樣可以作為參數進行傳遞,因為方法存在於字節碼文件內, 所以可以通過Class對象獲取字節碼文件中的內容。

  1. Method m = Class.getMethod("function",String.class);
  2. m.invoke(p,"heihei");

類或者方法都作為參數傳遞這樣對於開發到底有那些好處呢?

需求:設計一個主板,為了提高後期的擴展性,也就是為了後期提高電腦的額功能,對外提供了PCI的接口。以方便電腦功能的擴展。

  1. interface PCI{
  2. void open();
  3. void close();
  4. }
  5. class MainBoard{
  6. public void usePCI(PCI p){
  7. p.open();
  8. p.close();
  9. }
  10. }
  11. class MainBoardDemo{
  12. public static void main(String[] args){
  13. MainBoard mb=new MainBoard();
  14. //mb.usePCI(null);
  15. mb.usePCI(NetCard);
  16. }
  17. }

後期,要進行電腦功能的擴展,需加入一個網卡,只需要定義一個網卡類實現PCI接口,只要覆蓋這個規則,主板就可以使用該板卡。

  1. class NetCard implements PCI{
  2. public void open();{
  3. system.out.println("open");
  4. }
  5. public void close();{
  6. system.out.println("close");
  7. }
  8. }

那麼為了使用其網卡,還需要做一個步驟就是在已定義好的應用程序中,建立網卡對象,並作為參數傳入,那麼就是對原有的程序進行修改。這樣不利於程序的健壯性。

可不可以在不修改源碼的基礎上運行後期出現的這些子類對象呢?

只要在前期設計時,將後期指定的類進行對象的建立,這樣後期的子類對象就不需要再建立對象,只要將子類名稱告知即可。

為了獲取後期對象,並在前期可以使用,或對外提供了一個配置文件。前期程序可以直接操作該配置文件,後期的子類只需要將子類名稱存入配置文件即可。

這時就需要動態的獲取指定的類並預先創建對象

  1. 就用到了反射機制。重新修改一下應用程序。
  2. class MainBoardDemo{
  3. public static void main(String[] args){
  4. MainBoard mb=new MainBoard();
  5. File file=new File("conf.txt");
  6. BufferenReader buff = new BufferenReader(new FileReader(file));
  7. String className = buff.readLine();
  8. Class clazz = Class.forName(className);
  9. PCI p = (PCI)clazz.newInstance();
  10. mb.usePCI(p);
  11. }
  12. }

配置文件conf.txt

當後期出現網卡或者聲卡的時候,只需要將該子類的全類名存入配置文件即可, 源程序不需要進行修改

在該例中,可以了解,反射給我們的程序帶來了很強的擴展性。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved