熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

在Eclipse 3.1體驗J2SE 5.0新特性四(圖)

2013-11-23 20:08:00  來源: Java開源技術 

  Documented這個注釋(Annotation)將作為public API的一部分
  
  Inherited 假設注釋(Annotation)定義的時候使用了Inherited那麼如果這個注釋(Annotation)修飾某個class這個類的子類也被這個注釋(Annotation)所修飾
  
  注釋的應用
  
  下面各小節顯示了在哪些情況下可以使用注釋以及如何使用注釋
  
  動態查找注釋
  
  當我們定義好了注釋以後我們可以開發一些分析工具來解釋這些注釋這裡通常要用到Java的反射特性比如說我們希望找到某個對象/方法/域使用了哪些注釋或者獲得某個特定的注釋或者判斷是否使用某個特定的注釋 我們可以參考下面這個例子
  
  這個例子中定義了兩個注釋TODO和TOFORMATE在MyCalculator類中TODO用來修飾方法calculateRate而TOFORMATE用來修飾類變量concurrency和debitDate而在類TestCalculator的main函數中通過Java反射特性我們查找到使用這些注釋的類變量和方法清單清單分別顯示這些類的定義
  
  清單 TODO注釋的定義
  
  @Target({ElementTypeMETHOD})
  @Retention(RetentionPolicyRUNTIME)
  
  public @interface TODO {
  int priority() default ;
  }
  
  清單 TOFORMATE的定義
  
  @Target({ElementTypeFIELD})
  @Retention(RetentionPolicyRUNTIME)
  
  public @interface TOFORMATE {
  
  }
  
  清單 使用注釋的類MyCalculator
  
  public class MyCalculator {
  boolean isReady;
  @TOFORMATE double concurrency;
  @TOFORMATE Date debitDate;
  public MyCalculator() {
  super();
  }
  
  @TODO
  public void calculateRate(){
  Systemoutprintln(Calculating);
  }
  }
  
  清單動態查找注釋
  
  public class TestCalculator {
  public static void main(String[] args) {
  MyCalculator cal = new MyCalculator();
  calcalculateRate();
  try {
  Class c = calgetClass();
  Method[] methods = cgetDeclaredMethods();
  
  for (Method m: methods) {
  // 判斷這個方法有沒有使用TODO
  if (misAnnotationPresent(TODOclass))
  Systemoutprintln(Method +mgetName()+: the TODO is present);
  }
  
  Field[] fields = cgetDeclaredFields();
  for (Field f : fields) {
  // 判斷這個域有沒有使用TOFORMATE
  if (fisAnnotationPresent(TOFORMATEclass))
  Systemoutprintln
  (Field +fgetName()+: the TOFORMATE is present);
  }
  } catch (Exception exc) {
  excprintStackTrace();
  }
  }
  }
  
  下面我們來運行這個例子這個例子的運行結果如圖所示
  
  運行結果和我們先前的定義是一致的在運行時我們可以獲得注釋使用的相關信息
  
 

  
運行結果

  
  在我們介紹了什麼是注釋以後你可能會想知道注釋可以應用到什麼地方呢?使用注釋有什麼好處呢?在下面的小節中我們將介紹一個稍復雜的例子從這個例子中你將體會到注釋所以提供的強大的描述機制(declarative programming)
  
   使用注釋替代Visitor模式
  
  在JSE 以前我們在設計應用的時候我們經常會使用Visitor這個設計模式Visitor這個模式一般是用於為我們已經設計好了一組類添加方法而不需要擔心改變定義好的類比如說我們已經定義了好了一組類結構但是我們希望將這些類的對象部分數據輸出到某種格式的文件中
  
  Vistor模式的實現
  
  使用Vistor模式首先我們在Employee這個類中加入export方法export方法如圖所示Export方法接受Exporter對象作為參數並在方法體中調用exporter對象的visit()方法
  

  
使用Vistor模式實現格式輸出

  
  在這裡我們定義了一個Exporter抽象類我們可以通過繼承Exporter類重寫其visit方法來實現不同格式的文件輸出
  
  圖種給出visit方法的實現是一個簡單的例子如果要實現輸出成XML格式的可以定義Exporter子類XMLExporter如果希望輸出成文本的可以定義TXTExporter但是這樣做不夠靈活的地方在於如果Employee加入其他的域變量那麼相應的visitor類也需要進行修改這就違反了面向對象Open for Extension close for Modification的原則
  
  使用注釋替代Vistor模式
  
  使用注釋(Annotation)也可以完成數據輸出的功能首先定義一個新的注釋類型@Exportable然後定義一個抽象的解釋器ExportableGenerator將Employee 對象傳入解釋器
  
  在解釋器中查找哪些域使用了Exportable這個注釋(Annotation)將這些域(Field)按照一定格式輸出給出了Exportable注釋的定義
  
  清單注釋Exportable的定義
  
  @Target({ElementTypeFIELD})
  @Retention(RetentionPolicyRUNTIME)
  @Inherited
  public @interface Exportable {
  }
  清單清單中給出了包含數據的這些類的定義以及這些類是如何使用注釋Exportable的定義了Main函數使用ExporterGenerator來產生輸出文件清單給出了使用注釋來實現這一功能的兩個類ExporterGenerator和TXTExporterGenerator
  
  其中ExporterGenerator定義了一個基本的框架而TXTExporterGenerator繼承了ExporterGenerator並且重寫了outputField方法在這個方法中實現了特定格式的輸出用戶可以繼承這個ExporterGenerator並且實現其中的抽象方法來定義自己期望的格式
  
  清單 Employee的類定義
  
  public abstract class Employee {
  public abstract String getName();
  public abstract String getEmpNo();
  public Employee() {
  super();
  }
  }
  
  清單 Regular的類定義
  
  public class Regular extends Employee{
  @Exportable String name;
  @Exportable String address;
  @Exportable String title;
  @Exportable String phone;
  @Exportable String location;
  @Exportable Date onboardDate;
  @Exportable ArrayList team;
  String empNo;
  
  public Regular(String name String address String title String phone
  String location Date date) {
  super();
  thisname = name;
  thisaddress = address;
  thistitle = title;
  thisphone = phone;
  thislocation = location;
  onboardDate = date;
  team = new ArrayList();
  }
  
  public void addMemeber(Employee e){
  teamadd(e);
  }
  
  @Override
  public String getName() {
  // TODO Autogenerated method stub
  return name;
  }
  }
From:http://tw.wingwit.com/Article/program/Java/ky/201311/27990.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.