麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

Java應(yīng)用的動態(tài)擴展

2019-11-18 13:28:15
字體:
供稿:網(wǎng)友

  這里所謂的可擴展應(yīng)用,是指這樣的編程語言或者系統(tǒng),它可以在不修改現(xiàn)有系統(tǒng)整體或任意一部分功能的情況下,擴展自身的功能。對于傳統(tǒng)的編程語言,比如Cobol、C、C++,假如要為它們的應(yīng)用增加新功能,程序員必須重新編輯、編譯和發(fā)布程序,因為這些語言都是靜態(tài)鏈接的語言,不具備動態(tài)添加功能的機制(也就是說,生成執(zhí)行代碼的時候,所有的程序代碼必須事先預(yù)備妥當(dāng))。java應(yīng)用的可擴展能力突破了這些限制。
  
  Java應(yīng)用的可擴展功能包含了答應(yīng)動態(tài)地定義新的數(shù)據(jù)類型以及答應(yīng)用戶插入自己的程序例程的能力。這一切是如何實現(xiàn)的呢?下面我們通過實例來了解具體的實現(xiàn)過程。
  
  普通應(yīng)用的擴展
  
  在Java中,擴展性源于繼續(xù),具體手段或者是擴展一個類,或者是實現(xiàn)一個接口。Java接口的主要用途就在于此。(Java接口定義了一組方法,但不包含實現(xiàn)。實現(xiàn)某個接口的類必須實現(xiàn)該接口定義的所有方法,因而也就遵循某種確定的行為模式。)
  
  為什么說這個功能對于普通程序來說也很重要呢?假如一個程序是可以動態(tài)擴展的,用戶就不必再為了添加新功能而去修改源程序。這就避免了搞亂原有的代碼,使得用戶能夠?qū)W⒂谧约旱哪且徊糠执a。此外,程序不必為了引入新功能而重新啟動,這對于那些需要不間斷運行的程序來說無疑是一個福音。
  
  為進一步了解Java程序的動態(tài)擴展技術(shù),我們來看一個例子。一家快速增長的保險公司想要用計算機治理它的報價系統(tǒng)。這家公司現(xiàn)有兩個產(chǎn)品:人壽保險(lifecare)和醫(yī)療保險(medicare)。根據(jù)保額、期限、客戶年齡和保險產(chǎn)品的不同,月保險費用的計算方法也不同。系統(tǒng)應(yīng)該能夠在不修改原有代碼的情況下,引入保險公司推出的其他產(chǎn)品。為現(xiàn)有產(chǎn)品設(shè)計的類模型如圖一所示。
   Java應(yīng)用的動態(tài)擴展(圖一)
  當(dāng)一個客戶試圖獲取某種保險產(chǎn)品的報價時,系統(tǒng)創(chuàng)建一個對應(yīng)該產(chǎn)品類型的對象,調(diào)用該對象的calculatePRemium()方法,根據(jù)指定產(chǎn)品的計算方法計算出保險費用。系統(tǒng)利用一個xml文件(或?qū)傩晕募┟枋霈F(xiàn)有產(chǎn)品信息,比如保險產(chǎn)品的名稱和相應(yīng)的類名稱。XML文件如Listing 1所示。
  
  【Listing 1:描述產(chǎn)品信息的XML文件】
   Java應(yīng)用的動態(tài)擴展(圖二)
  系統(tǒng)從XML文件讀取指定產(chǎn)品的類的全稱,動態(tài)地創(chuàng)建對象。然后,系統(tǒng)調(diào)用calculatePremium(),根據(jù)指定的保額、期限和客戶年齡,按照特定產(chǎn)品的計算邏輯計算出精確的保險費。
  現(xiàn)在我們來看看系統(tǒng)如何動態(tài)地裝入對象。在把類裝入內(nèi)存和創(chuàng)建特定產(chǎn)品類型的對象時,系統(tǒng)用到了Java類庫java.lang.Class。Class類的實例或者代表著Java應(yīng)用中的一個類,或者代表著一個接口。在后臺,Java虛擬機(JVM)經(jīng)常利用Class類操作Java類;然而,用戶程序也同樣可以通過Class類的實例操作Java類。請參見Listing 2的Class類摘要。
  
  【Listing 2:Class類概要】
  
  public final class java.lang.Class extends
  
  java.lang.Object
  
  {
  
  public static Class forName(String className)
  
  public static Class forName(
  
  String name, boolean initialize, ClassLoader loader)
  
  public Class[] getClasses()
  
  public ClassLoader getClassLoader()
  
  public Class getComponentType()
  
  public ConstrUCtor getConstructor(Class[] parameterTypes)
  
  public Constructor[] getConstructors()
  
  public Class[] getDeclaredClasses()
  
  public Constructor getDeclaredConstructor(
  
  Class[] parameterTypes)
  
  public Constructor[] getDeclaredConstructors()
  
  public Field getDeclaredField(String name)
  
  public Field[] getDeclaredFields()
  
  
  public Method getDeclaredMethod(String name, Class[],
  
  parameterTypes)
  
  public Method[] getDeclaredMethods()
  
  public Class getDeclaringClass()
  
  public Field getField(String name)
  
  public Field[] getFields()
  
  public Class[] getInterfaces()
  
  public Method getMethod(
  
  String name, Class[] parameterTypes)
  
  public Method[] getMethods()
  
  public int getModifiers()
  
  public String getName()
  
  public Package getPackage()
  
  public ProtectionDomain getProtectionDomain()
  
  public URL getResource(String name)
  
  public InputStream getResourceAsStream(String name)
  
  public Object[] getSigners()
  
  public Class getSuperclass()
  
  public boolean isArray()
  
  public boolean isAssignableFrom(Class cls)
  
  public boolean isInstance(Object obj)
  
  public boolean isInterface()
  
  public boolean isPrimitive()
  
  public Object newInstance()
  
  public String toString()
  
  }
  在這里,我們感愛好的主要是forName()方法和newInstance()方法。靜態(tài)方法forName()返回和指定類名字關(guān)聯(lián)的Class對象。它通過類裝入器把類裝入到執(zhí)行程序。類名字參數(shù)可以是classpath中存在的任意一個類。假如不能找到指定類,則forName()方法拋出ClassNotFoundException異常。newInstance()方法為Class對象代表的類新建一個實例。newInstance()方法也利用類的不帶參數(shù)的構(gòu)造函數(shù)創(chuàng)建新對象,因此該類必須有一個不帶參數(shù)的構(gòu)造函數(shù)。假如newInstance()方法由于任何原因不能實例化一個類,它將拋出InstantiationException異常;假如不能訪問該類或它的構(gòu)造函數(shù),則拋出IllegalaccessException異常。Listing 3顯示了Product接口和它的實現(xiàn):MediCare,LifeCare。
  
  【Listing 3:Product接口及其實現(xiàn)】
  
  
  // Product.java
  
  // Product接口
  
  package com.test.dynamic;
  
  
  public interface Product
  
  {
  
  public float calculatePremium(
  
  float face-value,int term, int age);
  
  }
  
  
  // MediCare.java
  
  // Product的一個實現(xiàn)
  
  package com.test.dynamic;
  
  
  public class MediCare implements Product
  
  {
  
  public float calculatePremium(
  
  float face-value, int term , int age)
  
  {
  
  float premium;
  
  // 計算保險費
  
  // ......
  
  return premium;
  
  }
  
  }
  
  
  // LifeCare.java
  
  // Product的一個實現(xiàn)
  
  package com.test.dynamic;
  
  
  public class LifeCare implements Product
  
  {
  
  public float calculatePremium(
  
  float face-value, int term , int age)
  
  {
  
  float premium;
  
  // 計算保險費(不同的保險產(chǎn)品,計算方法不同)
  
  // .......
  
  return premium;
  
  }
  
  }
  當(dāng)用戶詢問報價時,報價系統(tǒng)根據(jù)保險產(chǎn)品的名字裝入并實例化產(chǎn)品類。下面我們用兩個方法實現(xiàn)裝入和調(diào)用代碼。GetProductFromName根據(jù)指定的產(chǎn)品名字生成合適的產(chǎn)品對象,makeQuote()方法計算保險費。Listing 4顯示了它們的代碼:
  
  【Listing 4:生成產(chǎn)品對象,計算保險費】
  
  public Object GetProductFromName(String productName)
  
  {
  
  // 待裝入對象的類名稱
  
  String className = null;
  
  // 利用XML分析庫org.xml.sax,
  
  // 從XML文件獲取產(chǎn)品的相應(yīng)類名稱
  
  // ......
  
  
  // 假定類名字對應(yīng)正確的產(chǎn)品,例如
  
  // "Com.test.dynamic.MediCare"
  
  try
  
  {
  
  Object o = null;
  
  o = Class.forName(className).newInstance();
  
  }
  
  //catch(ClassNotFoundException e){}
  
  //catch(InstantiationException e){}
  
  //catch(IllegalAccessException e){}
  
  catch( Exception e )
  
  {
  
  e.printStackTrace();
  
  }
  
  return o;
  
  }
  
  // makeQuote方法無返回值
  
  public void makeQuote()
  
  {
  
  String productName;
  
  float faceValue , premium ;
  
  int faceValue, age;
  
  
  // 從應(yīng)用的用戶界面獲取所有參數(shù),包括
  
  // 產(chǎn)品名稱、期限、保額、年齡
  
  // (有效的產(chǎn)品可以

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 中文字幕 欧美 日韩 | 久国产精品视频 | 日本欧美一区二区三区视频麻豆 | 毛片av网| av免费片| h视频在线免费观看 | 欧美在线观看黄色 | 毛片观看网址 | 伊人yinren22综合网色 | 久久91亚洲人成电影网站 | 亚洲精品久久久久久 | 有色视频在线观看 | 久久99精品久久久久久久久久久久 | 黄色aaa视频 | 一本一道久久久a久久久精品91 | 日本黄色一级视频 | 亚洲一区二区三区日本久久九 | 久久久一区二区精品 | 一级α片免费看刺激高潮视频 | 亚洲成人精品区 | 原来神马影院手机版免费 | free性欧美hd另类 | 91久久精品国产亚洲 | 毛片视频网站 | 精品午夜久久 | 国产二区三区在线播放 | 91久久国产综合久久91精品网站 | 成人影片在线免费观看 | 午夜国产在线 | 伊人一二三四区 | 黄色一级片免费在线观看 | 蜜桃91丨九色丨蝌蚪91桃色 | 欧美成人午夜 | 久久综合婷婷香五月 | 九九热视频免费 | 成人综合区一区 | 日本不卡一区二区三区在线观看 | 日本在线高清 | 羞羞的小视频 | 日本在线视频一区二区三区 | 久久精品国产99国产精品澳门 |