在Java 語言中,萬物皆物件。每個物件(Object)都是一個類別(Class)的 實例(Instance)。程式設計者可以根據需求,設計各式各樣的類別(Class)來產 生物件,或是使用類別中的方法,對物件進行操作。其中,有一些特殊設計的Java
物件,能提供程式設計者許多便利。有了這些物件後,加上 Java 對物件的
Reflection 機制,以及利用 annotation 夾帶不影響程式的額外資訊,將能更靈活 的運用Java 物件。以下將依序介紹 POJO、JavaBeans、Reflection、Annotation。
2.1.1 POJO
POJO 全名是 Plain Old Java Object[11],如同它字面上的意思,一個單純的 Java 物件,具有很高的可讀性與重複使用性。一個 POJO 具有下列特性:
1. POJO 不實現任何 interfaces、不繼承任何 class、不加註任何 annotation。
2. POJO 只有類別變數,變數的狀態可以是 private、public、protected 或是 default
3. 公開的設值方法(setter)和公開的取值方法(getter)。
圖2-1 POJO 示意圖
2.1.2 JavaBeans
JavaBeans[12][13]是 Java 中一種特殊的物件[19],屬於 POJO 的一種特例,
一樣具有很高的可讀性與重複使用性,常見於JSP 的開發之中。JavaBeans 的精
神在於,將資料的屬性值、方法、JavaBeans 的事件處理,全部包裝在同一類別 中,讓我們能有效的控管及使用資料。程式設計者可以使用 java.beans 這個 package,建構自己的 JavaBeans。
JavaBeans 中的所有屬性必須是私有的(private),確保我們只能用同一個 JavaBeans 裡的方法,修改或取得該 JavaBeans 的屬性值。JavaBeans 的屬性值大 致上可以分成四類[14][15]:
1. Simple properties:一般型別的屬性,包含其 get/set 方法。
2. Indexed properties:陣列型別的屬性,包含其 get/set 方法與特定陣列位置 的get/set 方法。
3. Bound properties:某個屬性的內容變更時,通知事件處理,或是通知某 個實作PropertyChangeListener 介面的 class,處理內容變更的屬性。
4. Constrained properties:某個屬性的內容改變時,在其允許條件內,可以 變更其內容;不在允許條件內,丟出Exception。
JavaBeans Methods[16]的定義就比較簡短:任何無關屬性定義的公開方法,
都是JavaBean 的方法。
JavaBeans 的事件處理[17][18]:JavaBeans 可以觸發任何類型的事件,也可 以自行定義事件處理的方法。如果要自行定義事件處理,事件的監聽器要繼承 java.util.EventListener。
2.1.3 Reflection
Reflection[7]是「電腦程式在執行時(run time)可以存取、檢測和修改它本 身狀態或行為的一種能力」。因為擁有reflection 機制,程式能夠在執行期間得知 自己的外觀,對自身進行檢測,甚至根據一些額外的資訊,改變程式狀態或結構,
實現自我複製或自我修改。這樣的機制,通常出現在腳本語言,或是以虛擬機器
為基礎的語言,例如:Java、C#、Python、JavaScript 等等,一般常見的 C 語言 或C++則沒有這項能力。
Java Reflection API[8]針對物件的類別(class)、類別變數成員(class field)、
方法(method)、建構函式(constructor),都有定義其 reflection 的方法,提供開 發者使用。我們以取得 Class 類別為例,Java reflection API 允許 Java 程式透過 Class 類別,指定一個類別名稱,取得該名稱的 Class 物件,或是透過 Object 類 別,取得該物件所屬的 Class 物件。Java 的 reflection 機制讓我們能更彈性的使 用、執行程式,允許正在執行中的程式操作自身內部的屬性。
本研究之系統,利用Java 中的 reflection 機制,獲取 Java class 中的各項資 訊,包含類別名稱、類別變數成員名稱、變數成員上的標籤等資訊。
2.1.4 Annotation
Annotation[9]是程式的 metadata,記有程式的資料,不會對程式的運行有影 響。在Java 程式進行編譯時,提供資訊讓編譯器處理,或是在程式執行期間,透 過Java reflection 處理標註的資訊。在 Java 中,有三個預先定義好的 annotation:
@Override、@Deprecated、@SuppressWarnings。
1. @Override:表示會重新定義父類別中的某個方法。
2. @Deprecated:表示被註記的方法是過時的,不建議使用,使用後會跳出 警告訊息。
3. @SuppressWarnings:會讓編譯器忽略警告訊息。
開發者也可以自行定義annotation,預設會將標註資訊儲存於.class 檔之中,
可被編譯器或bytecode 分析工具讀取,但是在執行時就無法讀取標註資訊。定義 annotation 時,增加@Retention,可以指定我們所定義的標註資訊會存在何處、是 否可讀取;增加@Target,可以限制被標註的對象[10]。
annotation 中的變數成員宣告,只允許特定型別的變數:基本型別(primitive type)、String、Class、Enum、另一個 Annotation,或是上述型別的陣列。變數成 員可依照個人需求,是否加入預設值,以下為一個添加預設值的自定義annotation 範例,只允許標註方法(method)。
圖2-2 自定義 annotation 範例
本研究之系統利用annotation,定義了 AnnotationForm 與 AnnotationStyle,
兩項標籤,標記本研究之系統所需的資訊。此部分將會在 3.2 系統實作中詳述。