① java如何進行單行注釋和多行注釋
(1)單行注釋:以「 // 」開頭後面接所要加的說明的內容。如下面所示: //定義變數a int a = 10; //定義變數b int b = 20;上面的語句中,在編譯的過程就會直接略過注釋,只會編譯 int a = 10 和 int b = 20這兩句。由此可見注釋只是起著說明的作用。
(2)多行注釋:以「/*」開頭,以「*/」結尾。 假設當你要說明你所寫的代碼的功能時。要說明的內容有很多。如果全部放在同一行會顯得很難看。所以一般會用多行來寫,如下所示// 說明//說明//說明//說明以上是用四個單行注釋來注釋四行說明。但如果有10行說明就要按十個「//」這顯示很麻煩,所以這時就可採用多行注釋。上面的可改成:/*說明說明說明說明*/也可以這樣/* 說明 說明 說明 說明 */
(3)文檔注釋:以「/**」開頭,以「*/」結尾。文檔注釋主要是生成文檔的。
② Java 註解的元註解
@Override
它的作用是對覆蓋超類中方法的方法進行標記,如果被標記的類並沒有實際覆蓋超類,則編譯器會發出錯誤警告。 Java代碼/***測試Override註解*@authorAdministrator*/publicclassOverrideDemoTest{//@OverridepublicStringtostring(){return測試註解;}}@Deprecated
它的作用是對不應該再使用的方法添加註解,當編程人員使用這些方法時,將會在編譯時顯示提示信息,它與javadoc里的@deprecated標記有相同的功能,准確的說,它還不如javadoc @deprecated,因為它不支持參數,使用@Deprecated的示例代碼示例如下: Java代碼/***測試Deprecated註解*@authorAdministrator*/publicclassDeprecatedDemoTest{publicstaticvoidmain(String[]args){//使用DeprecatedClass里聲明被過時的方法DeprecatedClass.DeprecatedMethod();}}classDeprecatedClass{@(){}}@SuppressWarnings
其參數有:
deprecation,使用了過時的類或方法時的警告
unchecked,執行了未檢查的轉換時的警告
fallthrough,當 Switch 程序塊直接通往下一種情況而沒有 Break 時的警告
path,在類路徑、源文件路徑等中有不存在的路徑時的警告
serial,當在可序列化的類上缺少serialVersionUID 定義時的警告
finally ,任何 finally 子句不能正常完成時的警告
all,關於以上所有情況的警告 Java代碼importjava.util.ArrayList;importjava.util.List;{publicstaticListlist=newArrayList();@SuppressWarnings(unchecked)publicvoidadd(Stringdata){list.add(data);}} 在Java編譯器編譯時,它會識別在源代碼里添加的註解是否還會保留,這就是RetentionPolicy。下面是Java定義的RetentionPolicy枚舉:
編譯器的處理有三種策略:
將註解保留在編譯後的類文件中,並在第一次載入類時讀取它;
將註解保留在編譯後的類文件中,但是在運行時忽略它;
按照規定使用註解,但是並不將它保留到編譯後的類文件中。 Java代碼publicenumRetentionPolicy{//此類型會被編譯器丟棄SOURCE,//此類型註解會保留在class文件中,但JVM會忽略它CLASS,//此類型註解會保留在class文件中,JVM會讀取它RUNTIME}Java代碼//讓保持性策略為運行時態,即將註解編碼到class文件中,讓虛擬機讀取@Retention(RetentionPolicy.RUNTIME)public@interfaceGreeting{//使用枚舉類型publicenumFontColor{BLUE,RED,GREEN};Stringname();FontColorfontColor()defaultFontColor.RED;} Java代碼//讓它允許繼承,可作用到子類@Inheritedpublic@interfaceGreeting{//使用枚舉類型publicenumFontColor{BLUE,RED,GREEN};Stringname();FontColorfontColor()defaultFontColor.RED;}
③ java源代碼編譯的時候怎麼處理注釋部分的
所謂的編譯就是把高級的語言翻譯成計算機可以識別的機器語言,所以當編譯程序編譯到注釋那段的時候程序也會把它編譯成機器碼的形似存儲在內存里,但是這個機器碼並不會執行,如果你學過匯編你就會知道它們的存儲空間是不一樣的
④ 在java代碼中,格式化之後怎麼保留注釋的格式
可以局部格式化啊,選中需要格式化的代碼,然後格式化,其他的不會受影響啊,或者在eclipse裡面設置格式化的格式
⑤ 誰給我這個JAVA程序添加完美注釋其中1個語句
在類Pattern中找到的正則表達式的編譯表示形式
指定為字元串的正則表達式必須首先被編譯為此類的實例。然後,可將得到的模式用於創建 Matcher 對象,依照正則表達式,該對象可以與任意字元序列匹配。執行匹配所涉及的所有狀態都駐留在匹配器中,所以多個匹配器可以共享同一模式。
因此,典型的調用順序是
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();在僅使用一次正則表達式時,可以方便地通過此類定義 matches 方法。此方法編譯表達式並在單個調用中將輸入序列與其匹配。語句
boolean b = Pattern.matches("a*b", "aaaaab");等效於上面的三個語句,盡管對於重復的匹配而言它效率不高,因為它不允許重用已編譯的模式。
此類的實例是不可變的,可供多個並發線程安全使用。Matcher 類的實例用於此目的則不安全。
正則表達式的構造摘要
構造 匹配
---------------(注意的是這里)-----------------------
字元
x 字元 x
\\ 反斜線字元
\0n 帶有八進制值 0 的字元 n (0 <= n <= 7)
\0nn 帶有八進制值 0 的字元 nn (0 <= n <= 7)
\0mnn 帶有八進制值 0 的字元 mnn(0 <= m <= 3、0 <= n <= 7)
\xhh 帶有十六進制值 0x 的字元 hh
\uhhhh 帶有十六進制值 0x 的字元 hhhh
\t 製表符 ('\u0009')
\n 新行(換行)符 ('\u000A')
\r 回車符 ('\u000D')
\f 換頁符 ('\u000C')
\a 報警 (bell) 符 ('\u0007')
\e 轉義符 ('\u001B')
\cx 對應於 x 的控制符
字元類
[abc] a、b 或 c(簡單類)
[^abc] 任何字元,除了 a、b 或 c(否定)
[a-zA-Z] a 到 z 或 A 到 Z,兩頭的字母包括在內(范圍)
[a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](並集)
[a-z&&[def]] d、e 或 f(交集)
[a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](減去)
[a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](減去)
預定義字元類
. 任何字元(與行結束符可能匹配也可能不匹配)
\d 數字:[0-9]
\D 非數字: [^0-9]
\s 空白字元:[ \t\n\x0B\f\r]
\S 非空白字元:[^\s]
\w 單詞字元:[a-zA-Z_0-9]
\W 非單詞字元:[^\w]
POSIX 字元類(僅 US-ASCII)
\p{Lower} 小寫字母字元:[a-z]
\p{Upper} 大寫字母字元:[A-Z]
\p{ASCII} 所有 ASCII:[\x00-\x7F]
\p{Alpha} 字母字元:[\p{Lower}\p{Upper}]
\p{Digit} 十進制數字:[0-9]
\p{Alnum} 字母數字字元:[\p{Alpha}\p{Digit}]
\p{Punct} 標點符號:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
\p{Graph} 可見字元:[\p{Alnum}\p{Punct}]
\p{Print} 可列印字元:[\p{Graph}\x20]
\p{Blank} 空格或製表符:[ \t]
\p{Cntrl} 控制字元:[\x00-\x1F\x7F]
\p{XDigit} 十六進制數字:[0-9a-fA-F]
\p{Space} 空白字元:[ \t\n\x0B\f\r]
java.lang.Character 類(簡單的 java 字元類型)
\p{javaLowerCase} 等效於 java.lang.Character.isLowerCase()
\p{javaUpperCase} 等效於 java.lang.Character.isUpperCase()
\p{javaWhitespace} 等效於 java.lang.Character.isWhitespace()
\p{javaMirrored} 等效於 java.lang.Character.isMirrored()
Unicode 塊和類別的類
\p{InGreek} Greek 塊(簡單塊)中的字元
\p{Lu} 大寫字母(簡單類別)
\p{Sc} 貨幣符號
\P{InGreek} 所有字元,Greek 塊中的除外(否定)
[\p{L}&&[^\p{Lu}]] 所有字母,大寫字母除外(減去)
邊界匹配器
^ 行的開頭
$ 行的結尾
\b 單詞邊界
\B 非單詞邊界
\A 輸入的開頭
\G 上一個匹配的結尾
\Z 輸入的結尾,僅用於最後的結束符(如果有的話)
\z 輸入的結尾
Greedy 數量詞
X? X,一次或一次也沒有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超過 m 次
Reluctant 數量詞
X?? X,一次或一次也沒有
X*? X,零次或多次
X+? X,一次或多次
X{n}? X,恰好 n 次
X{n,}? X,至少 n 次
X{n,m}? X,至少 n 次,但是不超過 m 次
Possessive 數量詞
X?+ X,一次或一次也沒有
X*+ X,零次或多次
X++ X,一次或多次
X{n}+ X,恰好 n 次
X{n,}+ X,至少 n 次
X{n,m}+ X,至少 n 次,但是不超過 m 次
Logical 運算符
XY X 後跟 Y
X|Y X 或 Y
(X) X,作為捕獲組
Back 引用
\n 任何匹配的 nth 捕獲組
引用
\ Nothing,但是引用以下字元
\Q Nothing,但是引用所有字元,直到 \E
\E Nothing,但是結束從 \Q 開始的引用
特殊構造(非捕獲)
(?:X) X,作為非捕獲組
(?idmsux-idmsux) Nothing,但是將匹配標志i d m s u x on - off
(?idmsux-idmsux:X) X,作為帶有給定標志 i d m s u x on - off
的非捕獲組 (?=X) X,通過零寬度的正 lookahead
(?!X) X,通過零寬度的負 lookahead
(?<=X) X,通過零寬度的正 lookbehind
(?<!X) X,通過零寬度的負 lookbehind
(?>X) X,作為獨立的非捕獲組
--------------------------------------------------------------------------------
反斜線、轉義和引用
反斜線字元 ('\') 用於引用轉義構造,如上表所定義的,同時還用於引用其他將被解釋為非轉義構造的字元。因此,表達式 \\ 與單個反斜線匹配,而 \{ 與左括弧匹配。
在不表示轉義構造的任何字母字元前使用反斜線都是錯誤的;它們是為將來擴展正則表達式語言保留的。可以在非字母字元前使用反斜線,不管該字元是否非轉義構造的一部分。
根據 Java Language Specification 的要求,Java 源代碼的字元串中的反斜線被解釋為 Unicode 轉義或其他字元轉義。因此必須在字元串字面值中使用兩個反斜線,表示正則表達式受到保護,不被 Java 位元組碼編譯器解釋。例如,當解釋為正則表達式時,字元串字面值 "\b" 與單個退格字元匹配,而 "\\b" 與單詞邊界匹配。字元串字面值 "\(hello\)" 是非法的,將導致編譯時錯誤;要與字元串 (hello) 匹配,必須使用字元串字面值 "\\(hello\\)"。
字元類
字元類可以出現在其他字元類中,並且可以包含並集運算符(隱式)和交集運算符 (&&)。並集運算符表示至少包含其某個操作數類中所有字元的類。交集運算符表示包含同時位於其兩個操作數類中所有字元的類。
字元類運算符的優先順序如下所示,按從最高到最低的順序排列:
1 字面值轉義 \x
2 分組 [...]
3 范圍 a-z
4 並集 [a-e][i-u]
5 交集 [a-z&&[aeiou]]
注意,元字元的不同集合實際上位於字元類的內部,而非字元類的外部。例如,正則表達式 . 在字元類內部就失去了其特殊意義,而表達式 - 變成了形成元字元的范圍。
行結束符
行結束符 是一個或兩個字元的序列,標記輸入字元序列的行結尾。以下代碼被識別為行結束符:
新行(換行)符 ('\n')、
後面緊跟新行符的回車符 ("\r\n")、
單獨的回車符 ('\r')、
下一行字元 ('\u0085')、
行分隔符 ('\u2028') 或
段落分隔符 ('\u2029)。
如果激活 UNIX_LINES 模式,則新行符是唯一識別的行結束符。
如果未指定 DOTALL 標志,則正則表達式 . 可以與任何字元(行結束符除外)匹配。
默認情況下,正則表達式 ^ 和 $ 忽略行結束符,僅分別與整個輸入序列的開頭和結尾匹配。如果激活 MULTILINE 模式,則 ^ 在輸入的開頭和行結束符之後(輸入的結尾)才發生匹配。處於 MULTILINE 模式中時,$ 僅在行結束符之前或輸入序列的結尾處匹配。
組和捕獲
捕獲組可以通過從左到右計算其開括弧來編號。例如,在表達式 ((A)(B(C))) 中,存在四個這樣的組:
1 ((A)(B(C)))
2 \A
3 (B(C))
4 (C)
組零始終代表整個表達式。
之所以這樣命名捕獲組是因為在匹配中,保存了與這些組匹配的輸入序列的每個子序列。捕獲的子序列稍後可以通過 Back 引用在表達式中使用,也可以在匹配操作完成後從匹配器獲取。
與組關聯的捕獲輸入始終是與組最近匹配的子序列。如果由於量化的緣故再次計算了組,則在第二次計算失敗時將保留其以前捕獲的值(如果有的話)例如,將字元串 "aba" 與表達式 (a(b)?)+ 相匹配,會將第二組設置為 "b"。在每個匹配的開頭,所有捕獲的輸入都會被丟棄。
以 (?) 開頭的組是純的非捕獲 組,它不捕獲文本,也不針對組合計進行計數。
Unicode 支持
此類符合 Unicode Technical Standard #18:Unicode Regular Expression Guidelines 第 1 級和 RL2.1 Canonical Equivalents。
Java 源代碼中的 Unicode 轉義序列(如 \u2014)是按照 Java Language Specification 的 第 3.3 節中的描述處理的。這樣的轉義序列還可以由正則表達式解析器直接實現,以便在從文件或鍵盤擊鍵讀取的表達式中使用 Unicode 轉義。因此,可以將不相等的字元串 "\u2014" 和 "\\u2014" 編譯為相同的模式,從而與帶有十六進制值 0x2014 的字元匹配。
與 Perl 中一樣,Unicode 塊和類別是使用 \p 和 \P 構造編寫的。如果輸入具有屬性 prop,則與 \p{prop} 匹配,而輸入具有該屬性時與 \P{prop} 不匹配。塊使用前綴 In 指定,與在 InMongolian 中一樣。可以使用可選前綴 Is 指定類別:\p{L} 和 \p{IsL} 都表示 Unicode 字母的類別。塊和類別在字元類的內部和外部都可以使用。
受支持的類別是由 Character 類指定版本中的 The Unicode Standard 的類別。類別名稱是在 Standard 中定義的,即標准又豐富。Pattern 所支持的塊名稱是 UnicodeBlock.forName 所接受和定義的有效塊名稱。
⑥ java 怎樣給源代碼添加註釋
1、單行(single-line)--短注釋://……
單獨行注釋:在代碼中單起一行注釋,
注釋前最好有一行空行,並與其後的代碼具有一樣的縮進層級。如果單行無法完成,則應採用塊注釋。
注釋格式:/*
注釋內容
*/
行頭注釋:在代碼行的開頭進行注釋。主要為了使該行代碼失去意義。
注釋格式://
注釋內容
行章節附註釋:尾端(trailing)--極短的注釋,在代碼行的行尾進行注釋。一般與代碼行後空8(至少4)個格,所有注釋必須對齊。
注釋格式:代碼
+
8(至少4)個空格
+
//
注釋內容
2、塊(block)--塊注釋:/*……*/
注釋若干行,通常用於提供文件、方法、數據結構等的意義與用途的說明,或者演算法的描述。一般位於一個文件或者一個方法的前面,起到引導的作用,也可以根據需要放在合適的位置。這種域注釋不會出現在HTML報告中。注釋格式通常寫成:
/*
*
注釋內容
*/
3、文檔注釋:/**……*/
注釋若干行,並寫入javadoc文檔。每個文檔注釋都會被置於注釋定界符
/**......*/
...
⑦ java編譯時,注釋是否編譯
注釋有注釋//和/*....*/,還有一種注釋/**.....,前兩種並不被編譯,但後一種用javadoc命令可以寫進文檔中!!!!!!
⑧ java注釋的自定義
它類似於新創建一個介面類文件,但為了區分,我們需要將它聲明為@interface,如下例:
Java代碼
packagecom.iwtxokhtd.annotation;
public@interfaceNewAnnotation {
}
使用自定義的註解類型
Java代碼
packagecom.iwtxokhtd.annotation;
publicclassAnnotationTest {
@NewAnnotation
publicstaticvoidmain(String[] args) {
}
}
為自定義註解添加變數
Java代碼
packagecom.iwtxokhtd.annotation;
public@interfaceAnnotation {
String value();
}
Java代碼
publicclassAnnotationTest {
@NewAnnotation(main method)
publicstaticvoidmain(String[] args) {
saying();
}
@NewAnnotation(value = say method)
publicstaticvoidsaying() {
}
}
定義一個枚舉類型,然後將參數設置為該枚舉類型,並賦予默認值
public@interfaceGreeting {
publicenum FontColor {
BLUE,RED,GREEN
};
String name();
FontColor fontColor()defaultFontColor.RED;
}
這里有兩種選擇,其實變數也就是在賦予默認值的參數上,我們可以選擇使用該默認值,也可以重新設置一個值來替換默認值
Java代碼
publicclassAnnotationTest {
@NewAnnotation(main method)
publicstaticvoidmain(String[] args) {
saying();
sayHelloWithDefaultFontColor();
sayHelloWithRedFontColor();
}
@NewAnnotation(say method)
publicstaticvoidsaying() {
}
// 此時的fontColor為默認的RED
@Greeting(name = defaultfontcolor)
() {
}
@Greeting(name = notdefault, fontColor = Greeting.FontColor.BLUE)
() {
} 1.1. 限制註解的使用范圍
用@Target指定ElementType屬性
Java代碼(jdk)
packagejava.lang.annotation;
public enum ElementType {
TYPE,
// 用於類,介面,枚舉但不能是註解
FIELD,
// 欄位上,包括枚舉值
METHOD,
// 方法,不包括構造方法
PARAMETER,
// 方法的參數
CONSTRUCTOR,
//構造方法
LOCAL_VARIABLE,
// 本地變數或catch語句
ANNOTATION_TYPE,
// 註解類型(無數據)
PACKAGE
// Java包
}
1.2. 註解保持性策略
Java代碼
//限制註解使用范圍
@Target({ElementType.METHOD,ElementType.CONSTRUCTOR})
public @interface Greeting {
//使用枚舉類型
public enum FontColor{
BLUE,RED,GREEN
};
String name();
FontColor fontColor() defaultFontColor.RED;
}
在Java編譯器編譯時,它會識別在源代碼里添加的註解是否還會保留,這就是RetentionPolicy。下面是Java定義的RetentionPolicy枚舉:
編譯器的處理有三種策略:
將註解保留在編譯後的類文件中,並在第一次載入類時讀取它
將註解保留在編譯後的類文件中,但是在運行時忽略它
按照規定使用註解,但是並不將它保留到編譯後的類文件中
Java代碼
packagejava.lang.annotation;
public enum RetentionPolicy{
SOURCE,
// 此類型會被編譯器丟棄
CLASS,
// 此類型註解會保留在class文件中,但JVM會忽略它
RUNTIME
// 此類型註解會保留在class文件中,JVM會讀取它
}
Java代碼
//讓保持性策略為運行時態,即將註解編碼到class文件中,讓虛擬機讀取
@Retention(RetentionPolicy.RUNTIME)
public @interface Greeting {
//使用枚舉類型
public enum FontColor{
BLUE,RED,GREEN
};
String name();
FontColor fontColor() defaultFontColor.RED;
}
1.3. 文檔化功能
Java提供的Documented元註解跟Javadoc的作用是差不多的,其實它存在的好處是開發人員可以定製Javadoc不支持的文檔屬性,並在開發中應用。它的使用跟前兩個也是一樣的,簡單代碼示例如下:
Java代碼
//讓它定製文檔化功能
//使用此註解時必須設置RetentionPolicy為RUNTIME
@Documented
public @interface Greeting {
//使用枚舉類型
public enum FontColor{
BLUE,RED,GREEN
};
String name();
FontColor fontColor() defaultFontColor.RED;
}
1.4. 標注繼承
Java代碼
//讓它允許繼承,可作用到子類
@Inherited
public @interface Greeting {
//使用枚舉類型
public enum FontColor{
BLUE,RED,GREEN
};
String name();
FontColor fontColor() defaultFontColor.RED;
}
2. 讀取註解信息
屬於重點,在系統中用到註解許可權時非常有用,可以精確控制許可權的粒度
注意:要想使用反射去讀取註解,必須將Retention的值選為Runtime
Java代碼
packagecom.iwtxokhtd.annotation;
importjava.lang.annotation.Annotation;
importjava.lang.reflect.Method;
//讀取註解信息
{
publicstaticvoidmain(String[] args)throws Exception {
// 測試AnnotationTest類,得到此類的類對象
Class c = Class.forName(com.iwtxokhtd.annotation.AnnotationTest);
// 獲取該類所有聲明的方法
Method[] methods =c.getDeclaredMethods();
// 聲明註解集合
Annotation[] annotations;
// 遍歷所有的方法得到各方法上面的註解信息
for(Method method : methods) {
// 獲取每個方法上面所聲明的所有註解信息
annotations =method.getDeclaredAnnotations();
// 再遍歷所有的註解,列印其基本信息
System.out.println(method.getName());
for(Annotation an :annotations) {
System.out.println(方法名為: + method.getName()+ 其上面的註解為:
+an.annotationType().getSimpleName());
Method[] meths =an.annotationType().getDeclaredMethods();
// 遍歷每個註解的所有變數
for(Method meth :meths) {
System.out.println(註解的變數名為: + meth.getName 注釋有三種:// /* */ /** */ 前兩種編譯器直接跳過,從來不閱讀,第三種編譯器是可以看懂的,當你使用javadoc這樣的命令時會用到,用來生成API時用的。
註解:這東東完全就是給編譯器看的。 比如@Ovrride表示這個方法是重寫了父類中的方法,而不是自定義的,所以這個時候編譯器會去檢查你的方法名是否和父類一樣,是否寫錯了。
以上是不同的概念
⑨ java開發中常用的註解有哪些
Java 註解全面解析,學習java做一個java工程師不但待遇高,而且前途無可限量。為什麼這樣說呢?因為java程序語言作為最流行的計算機開發語言之一,幾乎所有的系統、軟體、app、網頁等都是需要用到java的。
1.基本語法
註解定義看起來很像介面的定義。事實上,與其他任何介面一樣,註解也將會編譯成class文件。
@Target(ElementType.Method)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {}
除了@符號以外,@Test的定義很像一個空的介面。定義註解時,需要一些元註解(meta-annotation),如@Target和@Retention
@Target用來定義註解將應用於什麼地方(如一個方法或者一個域)
@Retention用來定義註解在哪一個級別可用,在源代碼中(source),類文件中(class)或者運行時(runtime)
在註解中,一般都會包含一些元素以表示某些值。當分析處理註解時,程序可以利用這些值。沒有元素的註解稱為標記註解(marker annotation)
四種元註解,元註解專職負責註解其他的註解,所以這四種註解的Target值都是ElementType.ANNOTATION_TYPE
註解 說明
@Target 表示該註解可以用在什麼地方,由ElementType枚舉定義
CONSTRUCTOR:構造器的聲明
FIELD:域聲明(包括enum實例)
LOCAL_VARIABLE:局部變數聲明
METHOD:方法聲明
PACKAGE:包聲明
PARAMETER:參數聲明
TYPE:類、介面(包括註解類型)或enum聲明
ANNOTATION_TYPE:註解聲明(應用於另一個註解上)
TYPE_PARAMETER:類型參數聲明(1.8新加入)
TYPE_USE:類型使用聲明(1.8新加入)
PS:當註解未指定Target值時,此註解可以使用任何元素之上,就是上面的類型
@Retention 表示需要在什麼級別保存該註解信息,由RetentionPolicy枚舉定義
SOURCE:註解將被編譯器丟棄(該類型的註解信息只會保留在源碼里,源碼經過編譯後,註解信息會被丟棄,不會保留在編譯好的class文件里)
CLASS:註解在class文件中可用,但會被VM丟棄(該類型的註解信息會保留在源碼里和class文件里,在執行的時候,不會載入到虛擬機(JVM)中)
RUNTIME:VM將在運行期也保留註解信息,因此可以通過反射機制讀取註解的信息(源碼、class文件和執行的時候都有註解的信息)
PS:當註解未定義Retention值時,默認值是CLASS
@Documented 表示註解會被包含在javaapi文檔中
@Inherited 允許子類繼承父類的註解
2. 註解元素
– 註解元素可用的類型如下:
– 所有基本類型(int,float,boolean,byte,double,char,long,short)
– String
– Class
– enum
– Annotation
– 以上類型的數組
如果使用了其他類型,那編譯器就會報錯。也不允許使用任何包裝類型。註解也可以作為元素的類型,也就是註解可以嵌套。
元素的修飾符,只能用public或default。
– 默認值限制
編譯器對元素的默認值有些過分挑剔。首先,元素不能有不確定的值。也就是說,元素必須要麼具有默認值,要麼在使用註解時提供元素的值。
其次,對於非基本類型的元素,無論是在源代碼中聲明,還是在註解介面中定義默認值,都不能以null作為值。這就是限制,這就造成處理器很難表現一個元素的存在或缺失狀態,因為每個註解的聲明中,所有的元素都存在,並且都具有相應的值。為了繞開這個限制,只能定義一些特殊的值,例如空字元串或負數,表示某個元素不存在。
@Target(ElementType.Method)
@Retention(RetentionPolicy.RUNTIME)
public @interface MockNull {
public int id() default -1;
public String description() default 「」;
}
3. 快捷方式
何為快捷方式呢?先來看下springMVC中的Controller註解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
String value() default 「」;
}
可以看見Target應用於類、介面、註解和枚舉上,Retention策略為RUNTIME運行時期,有一個String類型的value元素。平常使用的時候基本都是這樣的:
@Controller(「/your/path」)
public class MockController { }
這就是快捷方式,省略了名-值對的這種語法。下面給出詳細解釋:
註解中定義了名為value的元素,並且在應用該註解的時候,如果該元素是唯一需要賦值的一個元素,那麼此時無需使用名-值對的這種語法,而只需在括弧內給出value元素所需的值即可。這可以應用於任何合法類型的元素,當然了,這限制了元素名必須為value。
4. JDK1.8註解增強
TYPE_PARAMETER和TYPE_USE
在JDK1.8中ElementType多了兩個枚舉成員,TYPE_PARAMETER和TYPE_USE,他們都是用來限定哪個類型可以進行註解。舉例來說,如果想要對泛型的類型參數進行註解:
public class AnnotationTypeParameter<@TestTypeParam T> {}
那麼,在定義@TestTypeParam時,必須在@Target設置ElementType.TYPE_PARAMETER,表示這個註解可以用來標注類型參數。例如:
@Target(ElementType.TYPE_PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestTypeParam {}
ElementType.TYPE_USE用於標注各種類型,因此上面的例子也可以將TYPE_PARAMETER改為TYPE_USE,一個註解被設置為TYPE_USE,只要是類型名稱,都可以進行註解。例如有如下註解定義:
@Target(ElementType.TYPE_USE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {}
那麼以下的使用註解都是可以的:
List<@Test Comparable> list1 = new ArrayList<>();
List<? extends Comparable> list2 = new ArrayList<@Test Comparable>();
@Test String text;
text = (@Test String)new Object();
java.util. @Test Scanner console;
console = new java.util.@Test Scanner(System.in);
PS:以上@Test註解都是在類型的右邊,要注意區分1.8之前的枚舉成員,例如:
@Test java.lang.String text;
在上面這個例子中,顯然是在進行text變數標注,所以還使用當前的@Target會編譯錯誤,應該加上ElementType.LOCAL_VARIABLE。
@Repeatable註解
@Repeatable註解是JDK1.8新加入的,從名字意思就可以大概猜出他的意思(可重復的)。可以在同一個位置重復相同的註解。舉例:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Filter {
String [] value();
}
如下進行註解使用:
@Filter({「/admin」,」/main」})
public class MainFilter { }
換一種風格:
@Filter(「/admin」)
@Filter(「/main」)
public class MainFilter {}
在JDK1.8還沒出現之前,沒有辦法到達這種「風格」,使用1.8,可以如下定義@Filter:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(Filters.class)
public @interface Filter {
String value();
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Filters {
Filter [] value();
}
實際上這是編譯器的優化,使用@Repeatable時告訴編譯器,使用@Filters來作為收集重復註解的容器,而每個@Filter存儲各自指定的字元串值。
JDK1.8在AnnotatedElement介面新增了getDeclaredAnnotationsByType和getAnnotationsByType,在指定@Repeatable的註解時,會尋找重復註解的容器中。相對於,getDeclaredAnnotation和getAnnotation就不會處理@Repeatable註解。舉例如下:
@Filter(「/admin」)
@Filter(「/filter」)
public class FilterClass {
public static void main(String[] args) {
Class<FilterClass> filterClassClass = FilterClass.class;
Filter[] annotationsByType = filterClassClass.getAnnotationsByType(Filter.class);
if (annotationsByType != null) {
for (Filter filter : annotationsByType) {
System.out.println(filter.value());
}
}
System.out.println(filterClassClass.getAnnotation(Filter.class));
}
}
日誌如下:
/admin
/filter
null
望採納!
⑩ eclipse怎麼設置創建一個java文件後自動加入注釋
eclipse設置創建一個java文件後自動加入注釋的方法:
1、通過菜單 Window->Preference 打開參數設置面板,然後選擇:
Java -> Code Style -> Code Templates