国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

體驗Java 1.5中面向方面(AOP)編程

2019-11-18 10:49:03
字體:
來源:轉載
供稿:網友

  對于一個能夠訪問源代碼的經驗豐富的java開發人員來說,任何程序都可以被看作是博物館里透明的模型。類似線程轉儲(dump)、方法調用跟蹤、斷點、切面(PRofiling)統計表等工具可以讓我們了解程序目前正在執行什么操作、剛才做了什么操作、未來將做什么操作。但是在產品環境中情況就沒有那么明顯了,這些工具一般是不能夠使用的,或最多只能由受過練習的開發者使用。支持團隊和最終用戶也需要知道在某個時刻應用程序正在執行什么操作。
  
  為了填補這個空缺,我們已經發明了一些簡單的替代品,例如日志文件(典型情況下用于服務器處理)和狀態條(用于GUI應用程序)。但是,由于這些工具只能捕捉和報告可用信息的一個很小的子集,并且通常必須把這些信息用輕易理解的方式表現出來,所以程序員趨向于把它們明確地編寫到應用程序中。而這些代碼會纏繞著應用程序的業務邏輯,當開發者試圖調試或了解核心功能的時候,他們必須"圍繞這些代碼工作",而且還要記得功能發生改變后更新這些代碼。我們希望實現的真正功能是把狀態報告集中在某個位置,把單個狀態消息作為元數據(metadata)來治理。
  
  在本文中我將考慮使用嵌入GUI應用程序中的狀態條組件的情形。我將介紹多種實現這種狀態報告的不同方法,從傳統的硬編碼習慣開始。隨后我會介紹Java 1.5的大量新特性,包括注解(annotation)和運行時字節碼重構(instrumentation)。
  
  狀態治理器(StatusManager)
  我的主要目標是建立一個可以嵌入GUI應用程序的JStatusBar Swing組件。圖1顯示了一個簡單的Jframe中狀態條的樣式。
  
 體驗Java 1.5中面向方面(AOP)編程(圖一)

  
圖1.我們動態生成的狀態條

  
  由于我不希望直接在業務邏輯中引用任何GUI組件,我將建立一個StatusManager(狀態治理器)來充當狀態更新的入口點。實際的通知會被委托給StatusState對象,因此以后可以擴展它以支持多個并發的線程。圖2顯示了這種安排。
  
 體驗Java 1.5中面向方面(AOP)編程(圖二)

  
圖2. StatusManager和JstatusBar

  
  現在我必須編寫代碼調用StatusManager的方法來報告應用程序的進程。典型情況下,這些方法調用都分散地貫穿于try-finally代碼塊中,通常每個方法一個調用。
  public void connectToDB (String url) {
   StatusManager.push("Connecting to database");
   try {
  ...
   } finally {
  StatusManager.pop();
   }
  }
  
  這些代碼實現了我們所需要功能,但是在代碼庫中數十次、甚至于數百次地復制這些代碼之后,它看起來就有些混亂了。此外,假如我們希望用一些其它的方式訪問這些消息該怎么辦呢?在本文的后面部分中,我將定義一個用戶友好的異常處理程序,它共享了相同的消息。問題是我把狀態消息隱藏在方法的實現之中了,而沒有把消息放在消息所屬的接口中。
  
  面向屬性編程
  我真正想實現的操作是把對StatusManager的引用都放到代碼外面的某個地方,并簡單地用我們的消息標記這個方法。接著我可以使用代碼生成(code-generation)或運行時反?。╥ntrospection)來執行真正的工作。XDoclet項目把這種方法歸納為面向屬性編程(Attribute-Oriented Programming),它還提供了一個框架組件,可以把自定義的類似Javadoc的標記轉換到源代碼之中。
  
  但是,JSR-175包含了這樣的內容,Java 1.5為了包含真實代碼中的這些屬性提供了一種結構化程度更高的格式。這些屬性被稱為"注解(annotations)",我們可以使用它們為類、方法、字段或變量定義提供元數據。它們必須被顯式聲明,并提供一組可以包含任意常量值(包括原語、字符串、枚舉和類)的名稱-值對(name-value pair)。
  
  注解(Annotations)
  為了處理狀態消息,我希望定義一個包含字符串值的新注解。注解的定義非常類似接口的定義,但是它用@interface要害字代替了interface,并且只支持方法(盡管它們的功能更像字段):
  public @interface Status {
   String value();
  }
  
  與接口類似,我把@interface放入一個叫做Status.java的文件中,并把它導入到任何需要引用它的文件中。
  
  對我們的字段來說,value可能是個希奇的名稱。類似message的名稱可能更適合;但是,value對于Java來說具有非凡的意義。它答應我們使用@Status("...")代替@Status(value="...")來定義注解,這明顯更加簡捷。
  
  我現在可以使用下面的代碼定義自己的方法:
  
  @Status("Connecting to database")
  public void connectToDB (String url) {
  ...
  }
  
  請注重,我們在編譯這段代碼的時候必須使用-source 1.5選項。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阿拉尔市| 白银市| 阳山县| 普兰县| 兖州市| 博野县| 泗阳县| 获嘉县| 珠海市| 长海县| 陇西县| 文登市| 曲靖市| 富川| 睢宁县| 莱阳市| 广宁县| 凤翔县| 墨玉县| 东乡| 大兴区| 读书| 乌鲁木齐县| 潢川县| 榆树市| 台中市| 高雄市| 锦州市| 治多县| 开化县| 皮山县| 龙里县| 旅游| 台中市| 赤峰市| 临海市| 通州区| 墨脱县| 涪陵区| 景德镇市| 津市市|