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

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

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

2019-11-18 13:01:25
字體:
來源:轉載
供稿:網友

  3.Documented:這個注釋(Annotation)將作為public API的一部分。
  
  4.Inherited : 假設注釋(Annotation)定義的時候使用了Inherited,那么假如這個注釋(Annotation)修飾某個class,這個類的子類也被這個注釋(Annotation)所修飾。
  
  2.3注釋的應用
  
  下面各小節顯示了在哪些情況下可以使用注釋以及如何使用注釋。
  
  2.3.1動態查找注釋
  
  當我們定義好了注釋以后,我們可以開發一些分析工具來解釋這些注釋。這里通常要用到java的反射特性。比如說我們希望找到某個對象/方法/域使用了哪些注釋,或者獲得某個特定的注釋,或者判定是否使用某個特定的注釋, 我們可以參考下面這個例子。
  
  這個例子中定義了兩個注釋:TODO和TOFORMATE。在MyCalculator類中,TODO用來修飾方法calculateRate,而TOFORMATE用來修飾類變量concurrency和debitDate。而在類TestCalculator的main函數中,通過Java反射特性,我們查找到使用這些注釋的類變量和方法。清單12-清單15分別顯示這些類的定義。
  
  清單12 TODO注釋的定義
  
  @Target({ElementType.METHOD})
  @Retention(RetentionPolicy.RUNTIME)
  
  public @interface TODO {
  int PRiority() default 0;
  }
  
  清單13 TOFORMATE的定義
  
  @Target({ElementType.FIELD})
  @Retention(RetentionPolicy.RUNTIME)
  
  public @interface TOFORMATE {
  
  }
  
  清單14 使用注釋的類MyCalculator
  
  public class MyCalculator {
  boolean isReady;
  @TOFORMATE double concurrency;
  @TOFORMATE Date debitDate;
  public MyCalculator() {
  super();
  }
  
  @TODO
  public void calculateRate(){
  System.out.println("Calculating...");
  }
  }
  
  清單15動態查找注釋
  
  public class TestCalculator {
  public static void main(String[] args) {
  MyCalculator cal = new MyCalculator();
  cal.calculateRate();
  try {
  Class c = cal.getClass();
  Method[] methods = c.getDeclaredMethods();
  
  for (Method m: methods) {
  // 判定這個方法有沒有使用TODO
  if (m.isAnnotationPresent(TODO.class))
  System.out.println("Method "+m.getName()+": the TODO is present");
  }
  
  Field[] fields = c.getDeclaredFields();
  for (Field f : fields) {
  // 判定這個域有沒有使用TOFORMATE
  if (f.isAnnotationPresent(TOFORMATE.class))
  System.out.println
  ("Field "+f.getName()+": the TOFORMATE is present");
  }
  } catch (Exception exc) {
  exc.printStackTrace();
  }
  }
  }
  
  下面我們來運行這個例子,這個例子的運行結果如圖10所示。
  
  運行結果和我們先前的定義是一致的。在運行時,我們可以獲得注釋使用的相關信息。
  
 在Eclipse 3.1體驗J2SE 5.0新特性四(圖)(圖一)

  
圖6 運行結果

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

  
圖7 使用Vistor模式實現格式輸出

  
  在這里我們定義了一個Exporter抽象類,我們可以通過繼續Exporter類,重寫其visit方法來實現不同格式的文件輸出。
  
  圖7種給出visit方法的實現是一個簡單的例子。假如要實現輸出成xml格式的,可以定義Exporter子類:XMLExporter。假如希望輸出成文本的可以定義TXTExporter。但是這樣做不夠靈活的地方在于,假如Employee加入其他的域變量,那么相應的visitor類也需要進行修改。這就違反了面向對象Open for Extension, close for Modification的原則。
  
  使用注釋替代Vistor模式
  
  使用注釋(Annotation),也可以完成數據輸出的功能。首先定義一個新的注釋類型:@Exportable。然后定義一個抽象的解釋器ExportableGenerator,將Employee 對象傳入解釋器。
  
  在解釋器中,查找哪些域使用了Exportable這個注釋(Annotation),將這些域(Field)按照一定格式輸出。圖12給出了Exportable注釋的定義。
  
  清單16注釋Exportable的定義
  
  @Target({ElementType.FIELD})
  @Retention(RetentionPolicy.RUNTIME)
  @Inherited
  public @interface Exportable {
  }
  清單17-清單20中給出了包含數據的這些類的定義以及這些類是如何使用注釋Exportable的。 圖18定義了Main函數,使用ExporterGenerator來產生輸出文件。清單21給出了使用注釋來實現這一功能的兩個類:ExporterGenerator和TXTExporterGenerator。
  
  其中ExporterGenerator定義了一個基本的框架。而TXTExporterGenerator繼續了ExporterGenerator,并且重寫了outputField方法,在這個方法中實現了特定格式的輸出。用戶可以繼續這個ExporterGenerator,并且實現其中的抽象方法來定義自己期望的格式。
  
  清單17 Employee的類定義
  
  public abstract class Employee {
  public abstract String getName();
  public abstract String getEmpNo();
  public Employee() {
  super();
  }
  }
  
  清單18 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();
  this.name = name;
  this.address = address;
  this.title = title;
  this.phone = phone;
  this.location = location;
  onboardDate = date;
  team = new ArrayList();
  }
  
  public void addMemeber(Employee e){
  team.add(e);
  }
  
  @Override
  public String getName() {
  // TODO Auto-generated method stub
  return name;
  }
  }

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 黄色片免费看看 | 九九热视频在线免费观看 | 欧产日产国产精品乱噜噜 | 国产亚洲精品久久久闺蜜 | 国产成年免费视频 | 韩国草草影院 | 亚洲视频成人 | 一本色道久久99精品综合蜜臀 | 国产免费一区二区三区视频 | 一边吃奶一边摸下娇喘 | 日韩精品99久久久久久 | 精品成人久久久 | 色诱亚洲精品久久久久久 | 亚洲国产高清自拍 | 黄色免费大片 | 色屁屁xxxxⅹ免费视频 | 国产一区二区三区四区五区精品 | 竹内纱里奈和大战黑人 | 欧美精品一区二区久久 | 国产欧美精品一区二区三区四区 | 成年性羞羞视频免费观看 | 国产精品久久久久久影视 | 污视频在线免费播放 | 久久精品日产高清版的功能介绍 | chinesegv男男猛男无套 | 欧美一区在线观看视频 | 国产精品视频导航 | 久久新地址 | 日本在线高清 | 97se亚洲综合在线韩国专区福利 | 操操插插 | 久久吊 | 嗯哈~不行好大h双性 | 久久国产精品二区 | 热99在线视频 | 欧美特黄a| 中国的免费的视频 | 久久精品男人 | 国产亚洲高清视频 | 91精品国产刺激国语对白 | 亚州精品天堂中文字幕 |