亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 編程應用 > 正文

Java動態程序設計——反射介紹

2019-11-18 11:59:32
字體:
來源:轉載
供稿:網友

  java動態程序設計:反射介紹
  
  使用運行的類的信息使你的程序設計更加靈活
  
  反射授予了你的代碼訪問裝載進JVM內的Java類的內部信息的權限,并且答應你編寫在程序執行期間與所選擇的類的一同工作的代碼,而不是在源代碼中。這種機制使得反射成為創建靈活的應用程序的強大工具,但是要小心的是,假如使用不恰當,反射會帶來很大的副作用。在這篇文章中,軟件咨詢顧問Dennis Sosnoski 介紹了反射的使用,同時還介紹了一些使用反射所要付出的代價。在這里,你可以找到Java反射API是如何在運行時讓你鉤入對象的。
  
  在第一部分,我向你介紹了Java程序設計的類以及類的裝載。那篇文章中描述了很多出現在Java二進制類格式中的信息,現在我來介紹在運行時使用反射API訪問和使用這些信息的基礎。為了使那些已經了解反射基礎的開發人員對這些事情感愛好,我還會介紹一些反射與直接訪問的在性能方面的比較。
  
  使用反射與和metadata(描述其它數據的數據)一些工作的Java程序設計是不同的。通過Java語言反射來訪問的元數據的非凡類型是在JVM內部的類和對象的描述。反射使你可以在運行時訪問各種類信息,它甚至可以你讓在運行時讀寫屬性字段、調用所選擇的類的方法。
  
  反射是一個強大的工具,它讓你建立靈活能夠在運行時組裝的代碼,而不需要連接組件間的源代碼。反射的一些特征也帶來一些問題。在這章中,我將會探究在應用程序中不打算使用反射的原因,以為什么使用它的原因。在你了解到這些利弊之后,你就會在好處大于缺點的時候做出決定。
  
  初識class
  
  使用反射的起點總時一個java.lang.Class類的實例。假如你與一個預先確定的類一同工作,Java語言為直接獲得Class類的實例提供了一個簡單的快捷方式。例如:
  
  Class clas = MyClass.class;
  
  當你使用這項技術的時候,所有與裝載類有關的工作都發生在幕后。假如你需要在運行時從外部的資源中讀取類名,使用上面這種方法是不會達到目的的,相反你需要使用類裝載器來查找類的信息,方法如下所示:
  
  // "name" is the class name to load
  
  Class clas = null;
  
  try {
  
  clas = Class.forName(name);
  
  } catch (ClassNotFoundException ex) {
  
  // handle exception case
  
  }
  
  // use the loaded class
  
  假如類已經裝載,你將會找到當前在在的類的信息。假如類還沒有被裝載,那么類裝載器將會裝載它,并且返回最近創建的類的實例。
  
  關于類的反射
  
  Class對象給予你了所有的用于反射訪問類的元數據的基本鉤子。這些元數據包括有關類的自身信息,例如象類的包和子類,還有這個類所實現的接口,還包括這個類所定義的構造器、屬性字段以及方法的具體信息。后面的這些項是我們在程序設計過種經常使用的,因此在這一節的后面我會給出一些用這些信息來工作的例子。
  
  對于類的構造中的每一種類型(構造器、屬性字段、方法),java.lang.Class提供了四種獨立的反射調用以不的方式來訪問類的信息。下面列出了這四種調用的標準形式,它是一組用于查找構造器的調用。
  
  ConstrUCtor getConstructor(Class[] params)  使用指定的參數類型來獲得公共的構造器;
  
  Constructor[] getConstructors()  獲得這個類的所有構造器;
  
  Constructor getDeclaredConstructor(Class[] params) 使用指定的參數類型來獲得構造器(忽略訪問的級別)
  
  Constructor[] getDeclaredConstructors() 獲得這個類的所有的構造器(忽略訪問的級別)
  
  上述的每一種方法都返回一或多個java.lang.reflect.Constructor的實例。Constructor類定義了一個需要一個對象數據做為唯一參數的newInstance方法,然后返回一個最近創建的原始類的實例。對象數組是在構造器調用時所使用的參數值。例如,假設你有一個帶有一對String 類型做為參數的構造器的TwoString類,代碼如下所示:
  
  public class TwoString {
  
  PRivate String m_s1, m_s2;
  
  public TwoString(String s1, String s2) {
  
  m_s1 = s1;
  
  m_s2 = s2;
  
  }
  
  }
  
  下面的代碼顯示如何獲得TwoString類的構造器,并使用字符串“a”和“b”來創建一個實例:
  
  Class[] types = new Class[] { String.class, String.class };
  
  Constructor cons = TwoString.class.getConstructor(types);
  
  Object[] args = new Object[] { "a", "b" };
  
  TwoString ts = cons.newInstance(args);
  
  上面的代碼忽略了幾種可能的被不同的反射方法拋出的異常檢查的類型。這些異常在Javadoc API中有具體的描述,因此為簡便起見,我會在所有的代碼中忽略它們。
  
  在我涉及到構造器這個主題時,Java語言也定義了一個非凡的沒有參數的(或默認)構造器快捷方法,你能使用它來創建一個類的實例。這個快捷方法象下面的代碼這樣被嵌入到類的自定義中:
  
  Object newInstance() ?使用默認的構造器創建新的實例。
  
  盡管這種方法只讓你使用一個非凡的構造器,但是假如你需要的話,它是非常便利的快捷方式。這項技術在使用JavaBeans工作的時候尤其有用,因為JavaBeans需要定義一個公共的、沒有參數的構造器。
  
  通過反射來查找屬性字段
  
  Class類反射調用訪問屬性字段信息與那些用于訪問構造器的方法類似,在有數組類型的參數的使用屬性字段名來替代:使用方法如下所示:
  
  Field getField(String name) --獲得由name指定的具有public級別的屬性字段
  
  Field getFields() ?獲得一個類的所有具有public級別的屬性字段
  
  Field getDeclaredField(String name) ?獲得由name指定的被類聲明的屬性字段
  
  Field getDeclaredFields() ?獲得由類定義的所有的屬性字段
  
  盡管與構造器的調用很相似,但是在提到屬性字段的時候,有一個重要的差別:前兩個方法返回能過類來訪問的公共(public)屬性字段的信息(包括那些來自于超類的屬性字段),后兩個方法返回由類直接聲明的所有的屬性字段(忽略了屬性字段的訪問類型)。
  
  Java.lang.reflect.Field的實例通過調用定義好的getXXX和setXXX方法來返回所有的原始的數據類型,就像普通的與對象引用一起工作的get和set方法一樣。盡管getXXX方法會自動地處理數據類型轉換(例如使用getInt方法來獲取一個byte類型的值),但使用一個適當基于實際的屬性字段類型的方法是應該優先考慮的。
  
  下面的代碼顯示了如何使用屬性字段的反射方法,通過指定屬性字段名,找到一個對象的int類型的屬性字段,并給這個屬性字段值加1。
  
  public int incrementField(String name, Object obj) throws... {
  
  Field field = obj.getClass().getDeclaredField(name);
  
  int value = field.getInt(obj) + 1;
  
  field.setInt(obj, value);
  
  return value;
  
  }
  
  這個方法開始展現一些使用反射所可能帶來的靈活性,它優于與一個特定的類一同工作,incrementField方法把要查找的類信息的對象傳遞給getClass方法,然后直接在那個類中查找命名的屬性字段。
  
  通過反射來查找方法
  
  Class反射調用訪問方法的信息與訪問構造器和字段屬性的方法非常相似:
  
  Method getMethod(String name,Class[] params) --使用指定的參數類型獲得由name參數指定的public類型的方法。
  
  Mehtod[] getMethods()?獲得一個類的所有的public類型的方法
  
  Mehtod getDeclaredMethod(String name, Class[] params)?使用指定的參數類型獲得由name參數所指定的由這個類聲明的方法。
  
  Method[] getDeclaredMethods() ?獲得這個類所聲明的所有的方法
  
  與屬性字段的調用一樣,前兩個方法返回通過這個類的實例可以訪問的public類型的方法?包括那些繼續于超類的方法。后兩個方法返回由這個類直接聲明的方法的信息,而不管方法的訪問類型。
  
  通過調用返回的Java.lang.reflect.Mehtod實例定義了一個invoke方法,你可以使用它來調用定義類的有關實例。這個invoke方法需要兩個參數,一個是提供這個方法的類的實例,一個是調用這個方法所需要的參數值的數組。
  
  下面給出了比屬性字段的例子更加深入的例子,它顯示了一個的方法反射的例子,這個方法使用get和set方法來給JavaBean定義的int類型的屬性做增量操作。例如,假如對象為一個整數類型count屬性定義了getCount和setCount方法,那么為了給這個屬性做增量運算,你就可以把“count”做為參數名傳遞給調用的這個方法中。示例代碼如下:
  
  public int incrementProperty(String name, Object obj) {
  
  String prop = Character.toUpperCase(name.charAt(0)) +
  
  name.substring(1);
  
  String mname = "get" + prop;
  
  Class[] types = new Class[] {};
  
  Method method = obj.getClass().getMethod(mname, types);
  
  Object result = method.invoke(obj, new Object[0]);
  
  int value = ((Integer)result).intValue() + 1;
  
  mname =

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线播放日韩av| 欧美黄色免费网站| 欧美成aaa人片在线观看蜜臀| 亚洲精品动漫100p| 久久视频在线观看免费| 精品国产一区二区三区久久久狼| 日韩中文字幕在线观看| 国产精品久久久久久久久久免费| 日韩中文字幕在线视频| 国产一区二区av| 国产精品永久免费| 欧美小视频在线观看| 日韩电影中文字幕在线观看| 国产亚洲欧洲高清一区| 欧美日韩久久久久| 91精品国产综合久久香蕉922| 国自产精品手机在线观看视频| 国产成人自拍视频在线观看| 91国内免费在线视频| 亚洲精品视频在线观看视频| 日韩亚洲在线观看| 在线播放日韩欧美| 国产丝袜一区视频在线观看| 国产美女高潮久久白浆| 亚洲成人激情视频| 亚洲精品999| 亚洲人成网站色ww在线| 国产成人欧美在线观看| 色综合五月天导航| 日韩在线高清视频| 97精品国产91久久久久久| www.久久久久久.com| 亚洲精品欧美一区二区三区| 亚洲在线免费观看| 国产精品欧美一区二区三区奶水| 伊人久久五月天| 欧美激情亚洲自拍| 亚洲欧洲成视频免费观看| 伊人久久综合97精品| 亚洲成人精品视频| 欧美www视频在线观看| 亚洲精品日韩欧美| 欧美激情精品久久久久久蜜臀| 亚洲韩国日本中文字幕| 欧美精品日韩三级| 国产一区二区欧美日韩| 国产97在线|亚洲| 亚洲综合成人婷婷小说| 国内精品小视频在线观看| 日韩中文字幕视频在线| 成人黄色在线观看| 成人写真福利网| 最近免费中文字幕视频2019| 亚洲第一精品夜夜躁人人爽| 国产日韩中文字幕在线| 亚洲少妇中文在线| 精品无人区太爽高潮在线播放| 992tv在线成人免费观看| 欧美孕妇孕交黑巨大网站| 亚洲福利视频网站| 国产成人精品免高潮在线观看| 夜夜躁日日躁狠狠久久88av| 国产免费一区二区三区在线能观看| 91国内免费在线视频| 久久99亚洲热视| 国内免费久久久久久久久久久| 日本老师69xxx| 91精品国产综合久久香蕉| 亚洲男人天堂九九视频| 亚洲国产成人久久综合| 国产精品网站入口| 2019最新中文字幕| 欧美激情精品久久久久久| 欧美老少做受xxxx高潮| 国产精品麻豆va在线播放| 亚州av一区二区| 色综合五月天导航| 国产香蕉97碰碰久久人人| 亚洲免费电影在线观看| 久久久亚洲欧洲日产国码aⅴ| 精品免费在线观看| 国产有码在线一区二区视频| 欧美在线免费看| 国产亚洲a∨片在线观看| 2019中文字幕免费视频| 亚洲精品综合精品自拍| 91国产视频在线| 在线精品国产欧美| 欧美性受xxx| 久久国产精品亚洲| 免费不卡欧美自拍视频| 日韩在线视频导航| 国产亚洲精品综合一区91| 亚洲伊人成综合成人网| 亚洲人成电影网站色…| 国产精选久久久久久| 日韩激情av在线播放| 96pao国产成视频永久免费| 91禁国产网站| 国产日韩在线播放| 国产色综合天天综合网| 亚洲午夜未删减在线观看| 日本亚洲欧美三级| www.99久久热国产日韩欧美.com| 成人免费黄色网| 亚洲www永久成人夜色| 77777亚洲午夜久久多人| 欧美丝袜一区二区| 91精品视频一区| 大胆人体色综合| 北条麻妃一区二区三区中文字幕| 日韩专区在线观看| 国产精品入口免费视频一| 欧美激情精品久久久久久久变态| 亚洲自拍偷拍福利| 久久久久久久久中文字幕| 国产日韩欧美在线| 亚洲精品福利视频| 中文字幕国产亚洲2019| 亚洲精品视频在线观看视频| 亚洲欧美自拍一区| 成人网在线免费观看| 国产精品久久久久久久久久东京| 亚洲色图国产精品| 国产精品亚洲片夜色在线| 欧美性在线观看| 久久伊人色综合| 91成人在线视频| 亚洲女人天堂av| 精品久久久999| 久久久亚洲影院你懂的| 欧美亚洲在线播放| 91免费人成网站在线观看18| 久久99精品久久久久久青青91| 91啪国产在线| 欧美一区二区三区艳史| 成人亚洲欧美一区二区三区| 亚洲激情免费观看| 久久99亚洲热视| 国产精品免费一区| 九九热精品视频国产| 亚洲一区二区国产| 久久久成人的性感天堂| 久久久亚洲精选| 91成人国产在线观看| 国产日韩欧美视频在线| 色综合亚洲精品激情狠狠| 亚洲欧美一区二区激情| 欧美精品免费播放| 欧美日韩国产中文精品字幕自在自线| 中文字幕日本欧美| 欧美福利视频在线| 久久综合国产精品台湾中文娱乐网| 日韩一区二区在线视频| 91久久国产综合久久91精品网站| 91高清视频免费观看| 欧美另类xxx| 亚洲精品一区二三区不卡| 亚洲一区二区日本| www.久久色.com| 国产91av在线| 日韩激情av在线免费观看| 亚洲高清一二三区| 欧美激情免费看|