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

首頁 > 學院 > 開發(fā)設計 > 正文

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

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

  3.Documented:這個注釋(Annotation)將作為public API的一部分。
  
  4.Inherited : 假設注釋(Annotation)定義的時候使用了Inherited,那么假如這個注釋(Annotation)修飾某個class,這個類的子類也被這個注釋(Annotation)所修飾。
  
  2.3注釋的應用
  
  下面各小節(jié)顯示了在哪些情況下可以使用注釋以及如何使用注釋。
  
  2.3.1動態(tài)查找注釋
  
  當我們定義好了注釋以后,我們可以開發(fā)一些分析工具來解釋這些注釋。這里通常要用到java的反射特性。比如說我們希望找到某個對象/方法/域使用了哪些注釋,或者獲得某個特定的注釋,或者判定是否使用某個特定的注釋, 我們可以參考下面這個例子。
  
  這個例子中定義了兩個注釋:TODO和TOFORMATE。在MyCalculator類中,TODO用來修飾方法calculateRate,而TOFORMATE用來修飾類變量concurrency和debitDate。而在類TestCalculator的main函數(shù)中,通過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動態(tài)查找注釋
  
  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();
  }
  }
  }
  
  下面我們來運行這個例子,這個例子的運行結(jié)果如圖10所示。
  
  運行結(jié)果和我們先前的定義是一致的。在運行時,我們可以獲得注釋使用的相關信息。
  
 在Eclipse 3.1體驗J2SE 5.0新特性四(圖)(圖一)

  
圖6 運行結(jié)果

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

  
圖7 使用Vistor模式實現(xiàn)格式輸出

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 和田县| 云南省| 孟津县| 资溪县| 神池县| 武川县| 绥芬河市| 濉溪县| 精河县| 卢氏县| 隆安县| 平定县| 林口县| 望奎县| 托克托县| 龙游县| 棋牌| 津南区| 莒南县| 庆元县| 集安市| 安西县| 上犹县| 海淀区| 满洲里市| 淄博市| 岑巩县| 锡林郭勒盟| 上饶县| 土默特右旗| 婺源县| 阿城市| 萨嘎县| 东城区| 九龙坡区| 鄢陵县| 岳普湖县| 韶关市| 堆龙德庆县| 浑源县| 西乌珠穆沁旗|