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

首頁 > 學院 > 開發設計 > 正文

applet 的參數化 -- 對數組進行初始化

2019-11-18 11:56:50
字體:
來源:轉載
供稿:網友

  將列表數據提供給 applet
  看過關于 applet 參數化的上一篇技巧的讀者可能已經注重到:我們的方法沒有對一類重要的對象進行初始化。在本文中,我們將研究假如利用類反射機制對一維數組和二位數組進行初始化。我知道只有實現對更高維數組的處理才能使狂熱的科學家滿足,但我將把那項工作作為練習留給您。
  
  在我的上一篇技巧中,只能處理基本類型的數組和字符串數組??紤]到任何對象最終都能由基本數據類型和字符串構建而來,所以這將不會構成多大的限制。當然,很輕易將我們的技術加以擴展,之后就能直接對其他類型的數據進行初始化。
  
  數組是用來存儲列表數據的理想數據結構。我們的技術使得向 applet 傳遞列表參數變得很簡單。 通常利用動態生成 Html 文檔的程序(如 servlet 或 CGI 腳本)將列表數據傳遞給 applet。作為示例,我們設想一個比賽記分板 applet。HTML 生成器將會將當前的記分板數據庫輸出到 PARAM 標記中,接著相應的數組將被完全初始化 -- 這要歸功于我們的參數提取方法。
  
  列表數據項的語法
  我們要實現的就是一個從 PARAM 標記中提取一維或是二維數組的方法。一維數組的語法是:
  
  PARAM NAME="myArray" VALUE="element1 element2 ... elementN"
  
  各元素之間的定界符是空格。
  
  二位數組的語法是:
  
  PARAM NAME="myMatrix" VALUE="element11 element12 element13
  element21 element22 element23
  element31 element32 element33"
  
  各行之間的定界符是 符號。這里,myMatrix 是一個 (3 x 3) 數組。
  
  注重:java 支持不規則數組。 不規則數組就是各行的長度不同的數組。例如,HTML 作者可能會按以下方式輸入帕斯卡三角形:
  
  PARAM NAME="pascalTriangle" VALUE=" 1
  1 1
  1 2 1
  1 3 3 1
  1 4 6 4 1
  1 5 10 10 5 1
  1 6 15 20 15 6 1"
  
  初始化完成之后,pascalTriangle 域的內容將是:
  
  pascalTriangle[0] = {1}
  pascalTriangle[1] = {1, 1}
  pascalTriangle[2] = {1, 2, 1}
  pascalTriangle[3] = {1, 3, 3, 1}
  pascalTriangle[4] = {1, 4, 6, 4, 1}
  pascalTriangle[5] = {1, 5, 10, 10, 5, 1}
  pascalTriangle[5] = {1, 6, 15, 20, 15, 6, 1}
  
  通常,程序員應該只聲明 pascalTriangle,而不進行內存分配。我們的提取方法負責分配內存。但讓我們假定已為第四行分配了內存,如下所示:
  
  pascalTriangle[3] = new int[2];
  
  我們的方法將只提取前兩個元素。這樣,第四行的初始化結果將是:
  
  pascalTriangle[3] = {1, 3}
  
  數組知識回顧
  正如您在以上代碼清單中看到的那樣,我們的方法實現有點“深奧”。因此,在研究源代碼之前回顧有關數組的幾點知識是個不錯的主意。
  
  我們都對 Java 的類型層次結構比較熟悉:Java 有一組預定義的基本數據類型(int、float...),還有 Object 的子類的一個繼續樹,Object 類是所有類的最終超類。但 Java 中還存在一個不很出名的平行層次結構,我稱其為數組層次結構。您無論何時在類型層次結構中定義了一個新類型 Foo,您實際上也同時定義了一個自動結合到數組層次結構中的新類型 Foo[]。數組層次結構中的每個類(基本數據類型的數組除外)都是 Object[] 的子類。輕易引起混淆的是:Object[] 和基本數據類型的數組都是 Object 的子類。圖 1 表明了這一點。
  
applet 的參數化 -- 對數組進行初始化

  
圖 1:兩個平行的層次結構

  令人感到希奇的是,Java 根本就沒有多維數組,只有一維數組。多維數組實際上是“一維數組的數組的數組的數組...”。因此,我們可以創建不規則數組。事實上,我們甚至可以不對某些行進行初始化,而將它們保留為空值。
  
  數組提取方法的實現
  現在我們可以查看源代碼了。正如您所見,其中加了大量注釋。通常,包含如此多的注釋不是個好習慣,但在這里,我們要將已經抽象的 Java 數組包裝在由類反射機制提供的元數據抽象層中。結果,多數程序語句都不能表明其自身的含義,所以在這種情況下對幾乎每個代碼行作注釋是無可非議的。
  
  無論何時對一維或是二維數組進行初始化,最終我們都需要用 HTML 作者輸入的行對一維數組進行初始化。我們設計了一個方法來完成這一操作:
  
  /**
  * 用符號處理器 (tokenizer) 的內容填充一維數組。
  * 符號被轉換為數組的內容類型。
  *
  * @param array 要填充的數組。
  * @param elementTokens 包含要填入數組的符號的符號處理器。
  */
  PRivate static void fillOneDimensionalArray(Object array,
  StringTokenizer elementTokens)
  throws IllegalaccessException {
  
  if (array != null && elementTokens != null && array.getClass().isArray()) { // 雙重檢驗。
  // 數組應該容納哪種類型的元素?
  Class componentType = array.getClass().getComponentType();
  
  int numElements = elementTokens.countTokens();
  
  // 為數組元素賦值。
  //
  // 請注重,我們確保索引不會超出范圍。可能未給數組分配組足夠的空間,
  // 以致無法容納分析后的全部元素。
  for (int j = 0; j < Array.getLength(array) && j < numElements; j++) {
  // 將符號轉換為數組所容納的類型。
  // 然后將其添加到數組中。
  if (componentType.equals(boolean.class))
  Array.setBoolean(array, j, Boolean.valueOf(elementTokens.nextToken().trim()).booleanValue());
  
  else if (componentType.equals(byte.class))
  Array.setByte(array, j, Byte.valueOf(elementTokens.nextToken().trim()).byteValue());
  
  else if (componentType.equals(char.class))
  Array.setChar(array, j, elementTokens.nextToken().charAt(0));
  
  else if (componentType.equals(double.class))
  Array.setDouble(array, j, Double.valueOf(elementTokens.nextToken().trim()).doubleValue());
  
  else if (componentType.equals(float.class))
  Array.setFloat(array, j, Float.valueOf(elementTokens.nextToken().trim()).floatValue());
  
  else if (componentType.equals(int.class))
  Array.setInt(array, j, Integer.valueOf(elementTokens.nextToken().trim()).intValue());
  
  else if (componentType.equals(long.class))
  Array.setLong(array, j, Long.valueOf(elementTokens.nextToken().trim()).longValue());
  
  else if (componentType.equals(short.class))
  Array.setShort(array, j, Short.valueOf(elementTokens.nextToken().trim()).shortValue());
  
  else if (componentType.equals(String.class))
  Array.set(array, j, elementTokens.nextToken());
  }
  }
  }
  
  我們使用 Class.getComponentType() 方法獲取給定數組對象所容納的元素類型。一旦我們獲得這些信息,我們就知道應將行元素轉換為何種類型。這是在一個循環語句中完成的。
  
  您可能已猜到了,Array.setByte(Object obj, int i, byte datum) 用字節變量 datum 為 obj 數組的第 i 個元素賦值。這相當于 ((byte[])obj)[i] = datum。
  
  下面開始分析實現的核心部分。我對 Util.initializeApplet(Applet, String) 方法(在“Java 技巧 57”中實現)進行了擴展,在其中添加了一個條件語句,這個條件語句高速緩存數組域并對它們進行初始化。
  
  import java.applet.*;
  import java.lang.reflect.*;
  import java.util.*;
  
  public abstract class Util {
  
  /**
  * 對 applet 的名稱以給定篩選前綴開頭的非 final 公共域進行初始化。
  * 初始值將從 HTML PARAM 標記中讀取。
  * *
  * @param applet 要初始化的 applet。
  * @param filterPrefix 只對那些以此前綴開頭的域進行初始化。
  *
  * 假如前綴為空值,將對所有非 final 公共域進行初始化。
  */
  public static void initializeApplet(Applet applet, String filterPrefix) {
  
  Class metaclass = applet.getClass();
  Field[] fields = metaclass.getFields();
  String param = null;
  
  for (int i = 0; i < fields.length; i++) {
  try {
  param = applet.getParameter(fields[i].getName());
  
  if (param == null
  Modifier.isFinal(fields[i].getModifiers())
  ((filterPrefix != null) &&
  !fields[i].getName().startsWith(filterPrefix))
  )
  continue;
  
  Class fieldType = fields[i].getType();
  
  if (fieldType.equals(boolean.class)) {
  fields[i].setBoolean(applet, Boolean.valueOf(param).booleanValue());
  }
  else if (fieldType.equals(byte.class)) {
  fields[i].setByte(applet, Byte.valueOf(param).byteValue());
  }
  
  /***************

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品电影网| 亚洲一区第一页| 欧美极品在线播放| 欧美激情一区二区三级高清视频| 91精品国产综合久久男男| 国产日韩精品在线观看| 欧美日韩一区二区三区在线免费观看| 欧美激情奇米色| 欧美性猛交xxxx免费看漫画| 成人免费观看网址| 成人免费淫片aa视频免费| 性视频1819p久久| 在线观看国产精品淫| 国产精品在线看| 久久成人av网站| 国产欧美精品一区二区三区介绍| 91精品啪aⅴ在线观看国产| 黄色成人av网| 亚洲国产精品美女| 精品自在线视频| 日韩精品在线影院| 亚洲2020天天堂在线观看| 久久亚洲综合国产精品99麻豆精品福利| 国产成人精品网站| 欧美成人免费全部观看天天性色| 97人人爽人人喊人人模波多| 91亚洲永久免费精品| 91精品国产沙发| 色婷婷综合久久久久中文字幕1| 欧美日韩一区二区免费在线观看| 久久久久久久国产精品视频| 日韩禁在线播放| 精品国产福利视频| 精品国产乱码久久久久久婷婷| 国产日本欧美一区二区三区在线| 国产精品久久久久久久av电影| 久久久久久久久久久av| 亚洲四色影视在线观看| 色婷婷av一区二区三区久久| 午夜精品一区二区三区在线视频| 国产日产欧美精品| 欧美精品video| 国产亚洲精品综合一区91| 不卡av电影院| 啪一啪鲁一鲁2019在线视频| 隔壁老王国产在线精品| 国内揄拍国内精品少妇国语| 国产丝袜视频一区| xx视频.9999.com| 日韩av中文字幕在线| 少妇精69xxtheporn| 欧美大片大片在线播放| 国模gogo一区二区大胆私拍| 97视频在线看| 成人伊人精品色xxxx视频| 97精品一区二区视频在线观看| 久久综合伊人77777蜜臀| 久久久久久久久久久久久久久久久久av| 91精品啪aⅴ在线观看国产| 欧美激情在线视频二区| 亚洲国产中文字幕久久网| 亚洲国产精品久久久| 亚洲欧洲高清在线| 久久久噜噜噜久久| 亚洲精品福利免费在线观看| 日韩成人av一区| 2019国产精品自在线拍国产不卡| 亚洲成人久久久久| 欧美中文在线字幕| 777午夜精品福利在线观看| 美女啪啪无遮挡免费久久网站| 国产成人精品免费视频| 26uuu日韩精品一区二区| 国产精品久久久久久久天堂| 日本精品一区二区三区在线播放视频| 国产精品久久久久久久久久久久| 亚洲xxxx在线| www.欧美三级电影.com| 国产欧美日韩亚洲精品| 精品中文字幕久久久久久| 日本久久久久亚洲中字幕| 俺去了亚洲欧美日韩| 日韩中文字幕欧美| 欧美精品www| 日韩中文字幕网站| 国产欧美一区二区三区在线看| 久久天天躁日日躁| 97人洗澡人人免费公开视频碰碰碰| 欧美成人黄色小视频| 欧洲一区二区视频| 色青青草原桃花久久综合| 精品国产老师黑色丝袜高跟鞋| 国产精品影院在线观看| 日本不卡视频在线播放| 国产精品永久免费在线| 91在线观看免费高清| 亚洲精品久久久久中文字幕二区| 成人久久久久久久| 国产精品久久久久久久久久久久久久| 大荫蒂欧美视频另类xxxx| 视频在线观看99| 午夜精品一区二区三区在线视频| 欧美国产日韩一区二区在线观看| 欧美成人小视频| 精品久久久久久亚洲精品| 国产亚洲一级高清| 国产色婷婷国产综合在线理论片a| 欧美成人免费va影院高清| 亚洲欧美另类国产| 在线午夜精品自拍| 美女视频黄免费的亚洲男人天堂| 亚洲人成电影在线| 69视频在线免费观看| 久久久久成人网| 久久久亚洲影院你懂的| 国产999视频| 精品福利一区二区| 亚洲天堂开心观看| 在线观看国产成人av片| 欧美激情亚洲另类| 国内精品久久久久久久久| 亚洲另类激情图| 国产成人精品在线| 国产精品国产福利国产秒拍| 在线精品播放av| 国产精品私拍pans大尺度在线| 日韩免费高清在线观看| 精品亚洲国产成av人片传媒| 欧美国产亚洲视频| 欧美成人在线免费视频| 国产精品一区av| 欧美日韩国产精品一区二区不卡中文| 色av中文字幕一区| 国产美女久久久| 欧美香蕉大胸在线视频观看| 成人免费视频网址| 亚洲丁香婷深爱综合| 亚洲精品成人av| 国产精品久久久久av免费| 日韩中文字幕在线精品| 91国产一区在线| www国产亚洲精品久久网站| 亚洲乱亚洲乱妇无码| 国产91精品久久久久| 国产欧美精品日韩精品| 亚洲精品国产品国语在线| 久久久久久国产精品三级玉女聊斋| 日韩欧美在线观看| 中文字幕亚洲一区二区三区| 91国产高清在线| 91av在线视频观看| 欧美日韩亚洲精品一区二区三区| 国产欧美在线观看| 亚洲人成网站在线播| 精品性高朝久久久久久久| 美女国内精品自产拍在线播放| 久久久成人精品| 日本不卡高字幕在线2019| 欧美日韩爱爱视频| 久久久精品免费视频| 久久99青青精品免费观看| 亚洲精品永久免费精品| 欧美亚洲国产另类| 欧美性做爰毛片|