周全解析Java中的注解與正文。本站提示廣大學習愛好者:(周全解析Java中的注解與正文)文章只能為提供參考,不一定能成為您想要的結果。以下是周全解析Java中的注解與正文正文
注解
1、甚麼是 Annotation? (注解 or 正文)
Annotation, 精確的翻譯應當是 -- 注解。 和正文的感化完整紛歧樣。
Annotation 是JDK5.0及今後版本引入的一個特征。 與類、接口、列舉是在統一個條理,可以成為java 的一個類型。
語法是以@ 開首
簡略來講,
正文是法式員對源代碼的類,辦法,屬性等做的一些記憶或提醒性描寫(好比這個辦法是做甚麼用的),是給人來看的。
注解則是Java 編譯器可以懂得的部門,是給編譯器看的。
舉個簡略的例子來看一下注解的應用和感化。
@Override 是比擬罕見的Java 內置注解,它的感化就是在編譯代碼的時刻檢討子類中界說的辦法能否准確。
package annotation; public abstract class Animal { public abstract void eat(); } package annotation; public class Cat extends Animal{ @Override public void eat(String food) { } }
這裡在子類Cat中 eat 辦法被注解為覆寫父類的辦法, 然則卻比父類辦法多出一個參數。
假如是在Eclipse 在編纂的話, 直接就會有白色叉叉提醒。(代碼編譯會通不外)。
假如去失落@Override的注解的話, 編譯沒成績, 然則Cat 中eat辦法就是這個類的一個新的辦法了,而不是從父類繼續的了。
2、罕見的Java 內置注解
包括@Override , 還有哪些罕見的Java內置注解?
1. @Deprecated
注解為不建議應用,可以用在 辦法和類上。
根本上這類辦法和類都是由於進級或機能下面的一些緣由放棄不建議應用,然則為了兼容或其他緣由,還必需保存。
所以就打上這個注解。
在Java 自己的API中就有許多如許的例子, 辦法打上了這個注解,進到Source code 會看到替換的新的辦法是哪一個。
在eclipse 中編寫code時,添加此注解的辦法在聲明和挪用的處所都邑加上刪除線。
2.@Override
3.@SuppressWarnings
疏忽正告。
假如你的code在轉型或其他的部門有一些正告的話,然則你又想疏忽這些正告,便可以應用這個注解了。
1)deprecation 應用了不贊同應用的類或辦法時的正告
2)unchecked 履行了未檢討的轉換時正告
3)fallthrough 當應用switch操作時case後未參加break操作,而招致法式持續履行其他case語句時湧現的正告
4)path 當設置一個毛病的類途徑、源文件途徑時湧現的正告
5)serial 當在可序列化的類上缺乏serialVersionUID界說時的正告
6)fianally 任何finally子句不克不及正常完成時正告
7)all 關於以上一切情形的正告
3、自界說注解
除Java自己供給的內置注解, Java 還供給了定制自界說注解的功效。
界說的方法就是應用注解界說注解, 用來界說注解的注解稱為元注解。
重要的元注解有以下四個:@Target ;@Retention;@Documented;@Inherited
1. @Target 表現該注解用於甚麼處所,應用在類上,辦法上,或是屬性等
能夠的 ElemenetType 參數包含:
ElemenetType.CONSTRUCTOR 結構器聲明
ElemenetType.FIELD 域聲明(包含 enum 實例)
ElemenetType.LOCAL_VARIABLE 部分變量聲明
ElemenetType.METHOD 辦法聲明
ElemenetType.PACKAGE 包聲明
ElemenetType.PARAMETER 參數聲明
ElemenetType.TYPE 類,接口(包含注解類型)或enum聲明
2. @Retention 表現在甚麼級別保留該注解信息
可選的 RetentionPolicy 參數包含:
RetentionPolicy.SOURCE 注解將被編譯器拋棄
RetentionPolicy.CLASS 注解在class文件中可用,但會被VM拋棄
RetentionPolicy.RUNTIME VM將在運轉期也保存正文,是以可以經由過程反射機制讀取注解的信息。
3. @Documented ,發生doc時,能否包括此注解
將此注解包括在 javadoc 中
4. @Inherited
許可子類繼續父類中的注解
看一些簡略界說的例子:
package annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD) public @interface MyAnnotation { String value(); } @Retention(RetentionPolicy.SOURCE) @interface MyAnnotation1 { } @Retention(RetentionPolicy.CLASS) @interface MyAnnotation2 {} @Retention(RetentionPolicy.RUNTIME) @interface MyAnnotation3 {} @Documented @interface MyAnnotation4 {} @Inherited @interface MyAnnotation5 { }
4、應用例子:
package annotation; import java.lang.annotation.Annotation; @MyAnnotation3 public class TestAnnotation { public static void main(String[] args) { // TODO Auto-generated method stub Annotation annotation = TestAnnotation.class.getAnnotation(MyAnnotation3.class); System.out.println(annotation.toString()); } }
打印出成果: @annotation.MyAnnotation3()
以上例子假如調換應用 MyAnnotation1 和 MyAnnotation2 的話, 則取到的annotation的值為空,這就是RetentionPolicy 分歧的差異。
5、Annotation的感化
引見到此,可以總結一下Annotation的感化了。
基本的年夜致可以分為三類:
1. 編寫文檔
2. 代碼剖析
3. 編譯檢討
然則,開源框架對其付與了更多的感化
好比:
Hibernate,注解設置裝備擺設,
@Column("aa") private String xx;
這個相似於XML設置裝備擺設,簡化法式中的設置裝備擺設
絕對與把一部門元數據從XML文件移到了代碼自己當中,在一個處所治理和保護。
外部若何完成的? -- java 反射機制,相似與以上例子。
正文
固然注解、正文只相差一個字,然則用法就差別很年夜。
照樣那句話, 注解給編譯器看, 正文是給人看的。
基於此的話, 關於一個辦法來講:
1. 把這個辦法的感化, 輸出,輸入描寫清晰便可以了,更多的可以加上一些作者呀,版本呀如許一些信息
2. 正文編排的雅觀一些
做到這兩點應當便可以了。 舉個例子:
/******************************************************************************* * NAME: usage * DESCRIPTION: XXX * ARGUMENTS: N/A * RETURN: * AUTHOR: oscar999 * VERSION: V0.1 *******************************************************************************/
看上去這是一個不錯的正文^^.
然則關於Java 說話來講, 正文被付與了更多的功效。 就是你可使用javadoc 這個功效把代碼中的正文導出到 html 的文件中。
假如你的代碼是共用性很高的代碼的話, 這份文檔就是一份API的參考文檔, 相似Java API.
所以, 要發生出如許的文檔,就要遵守java 界說的一些正文標准, 能力發生出標准的文檔出來。
1、Java 類辦法的尺度正文
照樣從類的辦法的正文說起。
/** * Read a line of text. A line is considered to be terminated by any one * of a line feed ('\n'), a carriage return ('\r'), or a carriage return * followed immediately by a linefeed. * * @param ignoreLF1 If true, the next '\n' will be skipped <pre code_snippet_id="74911" snippet_file_name="blog_20131120_2_8365599" name="code" class="java"> * @param ignoreLF2 If true, the next '\n' will be skipped</pre> * * @return A String containing the contents of the line, not including * any line-termination characters, or null if the end of the * stream has been reached * * @see java.io.LineNumberReader#readLine() * * @exception IOException If an I/O error occurs */
(不去存眷以上正文的意義,只存眷其界說的款式)
1. 起首看最下面的 “Read a line of text. A line .. ” 這一段是對這個辦法的一些描寫。
第一個句號後面的部門, 也就是 “Read a line of text.” 會湧現在 “辦法摘要” 中
2. @param 界說的是辦法的輸出參數,(可以添加多個)湧現在“ 辦法具體信息” 中。(參數和參數描寫之間應用空格離隔, 在發生的文檔直達成了 -)
3. @return 前往值的描寫
4. @see 參考的描寫
5. @exception 異常拋出的描寫
雅觀斟酌, 分歧類的標簽可以換一行顯示, 好比 @param 和 @return 直接空一行。
2、Java 類尺度正文
類的正文和辦法正文的格局根本雷同。 差別的處所:
1. 放置的地位分歧。 類的正文放在類界說的下面, 辦法的正文放在辦法界說的下面。
2. 類的正文比擬會應用 @version @author @since 如許的標簽。
看模板
/** will buffer the input from the specified file. Without buffering, each * invocation of read() or readLine() could cause bytes to be read from the * file, converted into characters, and then returned, which can be very * inefficient. * * * Test Description * * <p> Programs that use DataInputStreams for textual input can be localized by * replacing each DataInputStream with an appropriate BufferedReader. * * @see FileReader * @see InputStreamReader * * @version 0.1, 11/20/13 * @author oscar999 * @since JDK1.5 */
doc 中顯示的後果是:
異樣, 描寫的第一句湧現在“類概要”中。
類的具體信息顯示以下:
值得留意的是 description 中<p> 的應用。 假如沒有加<p> , 在java code 中不論能否有換行,發生的doc 中都不換行。 加上<p> 的話, doc 中湧現換行。
3、彌補
彌補一下, 發生javadoc的辦法:
1. 定名行方法: javadoc + 參數
2. 應用Eclipse IDE 導出
假如在Eclipse IDE 中, 在源文件或是項目上右鍵單擊 , 選 Export --->
Java --> Javadoc 便可以發生了。