註解

1.用文字來解釋字句。 2.泛指解釋。 3.解釋字句的文字。 4.神鬼名。民間傳說指陰司第一閻王殿中職掌解送鬼魂並令其註冊者。” 艾蕪 《人生哲學的一課》三:“﹝我﹞就只是知道這一點子,然而這一點也盡夠一個淪落人的註解了。” 胡適 《<墨子小取篇>新詁·序例》:“全篇共分九節,現在逐節分寫。” 明 呂柟 《朱四子抄釋》卷一:“讀書須是將本文熟讀,且咀嚼有味,若有理會不得處,然後將註解看,方是有益。” 清 朱之瑜 《答桐山知幾書》:“故不肖於古文子史中註解時有批抹者,此惟可與知者道耳,與庸人言,無不抵掌而笑。

基本信息

引文

《後漢書·儒林傳上·楊倫》:“ 扶風 杜林 傳《古文尚書》、 林 同郡 賈逵 為之作訓, 馬融 作傳, 鄭玄 註解,由是《古文尚書》遂顯於世。” 宋 歐陽修 《<刪正黃庭經>序》:“其難曉之言,略為註解。” 清 平步青 《霞外攟屑·論文上·杜牧之》:“今之言者,必曰使聖人微旨不傳,乃 鄭玄 輩為註解之罪,仆觀其所解釋,明白完具。” 《兒女英雄傳》第三八回:“好端端的話,被這位太太一下注解,他姊妹聽著益發不好意思。” 艾蕪 《人生哲學的一課》三:“﹝我﹞就只是知道這一點子,然而這一點也盡夠一個淪落人的註解了。” 三國 吳 陸績 《述玄》:“後數年專精讀之,半歲間粗覺其意,於是草創註解,未能也。” 宋 趙與時 《賓退錄》卷一:“ 靈素 被旨修道書,改正諸家醮儀,校讎《丹經·靈篇》,刪修註解。” 清 俞樾 《茶香室續鈔·李善注<文選>有數本》:“其絕筆之本,兼釋音訓義,註解甚多。” 胡適 《<墨子小取篇>新詁·序例》:“全篇共分九節,現在逐節分寫。本文逐字隔開,註解用五號字,注之注用六號字。” 明 李贄 《答鄧石陽書》:“昨者復書‘真空’十六字,已說得無滲漏矣,今復為註解以請正,何如?” 《鏡花緣》第九三回:“不是《博雅》、《方言》的別名,就是《山海經》、《拾遺記》的冷名,先要註解,豈能雅俗共賞。” 元 無名氏 《端正好》套曲:“初學篤志真心愛,廣看些經書註解,忽然間心地悟豁然開。” 明 呂柟 《朱四子抄釋》卷一:“讀書須是將本文熟讀,且咀嚼有味,若有理會不得處,然後將註解看,方是有益。” 清 朱之瑜 《答桐山知幾書》:“故不肖於古文子史中註解時有批抹者,此惟可與知者道耳,與庸人言,無不抵掌而笑。” 清 李斗 《揚州畫舫錄·新城北錄中》:“一為 關帝 、二十四功曹、二十四註解、北極、五祖、天師出跡。”

JAVA中的註解

java.lang.annotation.Retention可以在您定義Annotation型態時,指示編譯器如何對待您的自定義 Annotation,預設上編譯器會將Annotation資訊留在class檔案中,但不被虛擬機器讀取,而僅用於編譯器或工具程式運行時提供資訊。

在使用Retention型態時,需要提供java.lang.annotation.RetentionPolicy的列舉型態:

package java.lang.annotation;

public enum RetentionPolicy {

SOURCE, //編譯器處理完Annotation資訊後就沒事了

CLASS, //編譯器將Annotation儲存於class檔中,預設

RUNTIME //編譯器將Annotation儲存於class檔中,可由VM讀入

}

RetentionPolicy為SOURCE的例子是SuppressWarnings,這個資訊的作用僅在告知編譯器抑制警訊,所以不必將這個資訊儲存於class檔案。

RetentionPolicy為RUNTIME的時機,可像是您使用Java設計一個程式碼分析工具,您要VM讀出Annotation資訊,以在分析程式中使用,搭配Reflection機制,就可以達到這個目的。

在J2SE 5.0中新增了java.lang.reflect.AnnotatedElement這個界面,當中定義有四個方法:

public Annotation getAnnotation(Class annotationType);

public Annotation[] getAnnotations();

public Annotation[] getDeclaredAnnotations();

public boolean isAnnotationPresent(Class annotationType);

Class、Constructor、Field、Method、Package等類別,都實作了AnnotatedElement這個介面,所以您可以從這些類別的實例上,分別取得標示於其上的Annotation與其資訊,如果RetentionPolicy為RUNTIME的話。

舉個例子來說,假設您設計了以下的Debug Annotation:

* Debug.java

package onlyfun.caterpillar;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)

public @interface Debug {

String value();

String name();

}

由於RetentionPolicy為RUNTIME,編譯器在處理Debug Annotation時,會將之編譯至class檔中,並可以VM讀出Annotation資訊,接著我們將Debug用於程式中:

* SomeObject.java

package onlyfun.caterpillar;

public class SomeObject {

@Debug(

value = "unit",

name = "debug1"

)

public void doSomething() {

// ....

}

}

可以設計一個工具程式來讀取Annotation資訊:

* DebugTool.java

package onlyfun.caterpillar;

import java.lang.annotation.Annotation;

import java.lang.reflect.Method;

public class DebugTool {

public static void main(String[] args)

throws NoSuchMethodException {

Class c = SomeObject.class;

Method method = c.getMethod("doSomething");

if(method.isAnnotationPresent(Debug.class)) {

System.out.println("@Debug is found.");

Debug debug = method.getAnnotation(Debug.class);

System.out.println("\tvalue = " + debug.value());

System.out.println("\tname = " + ());

}

else {

System.out.println("@Debug is not found.");

}

Annotation[] annotations = method.getAnnotations();

for(Annotation annotation : annotations) {

System.out.println(

annotation.annotationType().getName());

}

}

}

程式的執行結果如下:

@Debug is found.

value = unit

name = debug1

onlyfun.caterpillar.Debug

熱門詞條

聯絡我們