什么是注解
注解是用來(lái)對(duì)Java代碼進(jìn)行注釋和解釋的一種標(biāo)識(shí),這種標(biāo)識(shí)同時(shí)可以被用來(lái)傳遞參數(shù)和信息云芦,它的本質(zhì)是元數(shù)據(jù),即代碼的元數(shù)據(jù)贸桶。簡(jiǎn)單來(lái)說(shuō)舅逸,我們可以將注解理解成標(biāo)簽,標(biāo)簽有自己的格式和屬性刨啸,注解也是一樣堡赔。
注解的作用
- 生成文檔
- 跟蹤代碼依賴性,實(shí)現(xiàn)替代配置文件功能设联,減少配置善已。
- 在編譯時(shí)進(jìn)行格式檢查,如@Overload
注解分類及使用
-
元注解
:用來(lái)對(duì)其它注解進(jìn)行注解.Java5.0定義了四個(gè)標(biāo)準(zhǔn)的meta-annotation類型來(lái)對(duì)其它注解進(jìn)行說(shuō)明离例。- @Target(ElementType)
- @Target說(shuō)明了Annotation所修飾的對(duì)象范圍:Annotation可被用于 packages换团、types(類、接口宫蛆、枚舉艘包、Annotation類型)、類型成員(方法耀盗、構(gòu)造方法想虎、成員變量、枚舉值)叛拷、方法參數(shù)和本地變量(如循環(huán)變量舌厨、catch參數(shù))。在Annotation類型的聲明中使用了target可更加明晰其修飾的目標(biāo)忿薇。
作用:用于描述注解的使用范圍裙椭。
ElementType取值有:
1.CONSTRUCTOR
:用于描述構(gòu)造器
2.FIELD
:用于描述域
3.LOCAL_VARIABLE
:用于描述局部變量
4.METHOD
:用于描述方法
5.PACKAGE
:用于描述包
6.PARAMETER
:用于描述參數(shù)
7.TYPE
:用于描述類躏哩、接口(包括注解類型) 或enum聲明
參考代碼:
- @Target說(shuō)明了Annotation所修飾的對(duì)象范圍:Annotation可被用于 packages换团、types(類、接口宫蛆、枚舉艘包、Annotation類型)、類型成員(方法耀盗、構(gòu)造方法想虎、成員變量、枚舉值)叛拷、方法參數(shù)和本地變量(如循環(huán)變量舌厨、catch參數(shù))。在Annotation類型的聲明中使用了target可更加明晰其修飾的目標(biāo)忿薇。
@Retention(value={ElementType.FIELD,ElementType.METHOD}) Public @interface SimpleAnnotation{ String value(); }
- @Retention(RetentionPolicy)
- @Retention定義了該annotation保留時(shí)間的長(zhǎng)短;某些annotation僅出現(xiàn)在源代碼中揉燃,而被編譯器丟棄扫尺,而另一些卻被編譯在class文件中;編譯在class文件中的Annotation可能會(huì)被虛擬機(jī)忽略炊汤,而另一些在class被裝載時(shí)將被讀日ぁ(請(qǐng)注意并不影響class的執(zhí)行,因?yàn)锳nnotation與class在使用上是被分離的)婿崭。使用這個(gè)meta-Annotation可以對(duì) Annotation的“生命周期”限制拨拓。
作用:表示需要在什么級(jí)別保存該注釋信息肴颊,用于描述注解的生命周期(即:被描述的注解在什么范圍內(nèi)有效)
RetentionPolicy取值:
1.SOURCE
:在源文件中有效(即源文件保留)
2.CLASS
:在class文件中有效(即class保留)
3.RUNTIME
:在運(yùn)行時(shí)有效(即運(yùn)行時(shí)保留)
參考代碼:
@Retention(value=RetentionPolicy.RUNTIME) Public @interface SimpleAnnotation{ String value(); }
- @Documented
- @Documented用于描述其它類型的annotation應(yīng)該被作為被標(biāo)注的程序成員的公共API氓栈,因此可以被例如javadoc此類的工具文檔化。Documented是一個(gè)標(biāo)記注解婿着,沒(méi)有成員授瘦。
- @Inherited
- @inherited用來(lái)標(biāo)記某個(gè)類是繼承的,被他自己的子類所繼承竟宋;類并不從它所實(shí)現(xiàn)的接口繼承annotation提完,方法并不從它所重載的方法繼承annotation。
參考代碼:
- @inherited用來(lái)標(biāo)記某個(gè)類是繼承的,被他自己的子類所繼承竟宋;類并不從它所實(shí)現(xiàn)的接口繼承annotation提完,方法并不從它所重載的方法繼承annotation。
@Inherited public @interface Greeting { public enum FontColor{ BULE,RED,GREEN}; String name(); FontColor fontColor() default FontColor.GREEN; }
- @Target(ElementType)
-
jdk注解
jdk注解用處廣泛丘侠,在我們編寫(xiě)程序時(shí)徒欣,我們常常會(huì)遇到一些編譯時(shí)的錯(cuò)誤無(wú)法解決,很可能是因?yàn)闆](méi)有遵循一些java規(guī)范蜗字,這時(shí)通過(guò)注解我們就可以很清晰的找到編譯可能出錯(cuò)點(diǎn)打肝,根據(jù)注解對(duì)應(yīng)的規(guī)則進(jìn)行修改。- @override
- 重寫(xiě)注解挪捕,一般放在方法上粗梭,標(biāo)示該方法一定要重寫(xiě)父類的方法方能通過(guò)編譯。
- @overload
- 重載注解级零,用于方法重載說(shuō)明断医,編譯通過(guò)必須遵循重載規(guī)則。
- @Deprecated
- 過(guò)時(shí)的奏纪,一般用來(lái)指示某個(gè)方法或者變量命名已經(jīng)過(guò)時(shí)鉴嗤,將會(huì)有新的方法代替。
- @SupressWarnings
- 用來(lái)去除編譯時(shí)產(chǎn)生的警告序调,例如泛型的使用不當(dāng)醉锅,類型轉(zhuǎn)換錯(cuò)誤,對(duì)象的強(qiáng)轉(zhuǎn)是會(huì)產(chǎn)生一些警告炕置,這是通過(guò)注解可以將這些警消除荣挨,方便我們更好的完善代碼男韧。
- @override
自定義注解
自定義注解格式
public @interface 注解名{
定義體
}
用@interface自定義注解時(shí),自動(dòng)繼承了java.lang.annotation.Annotation接口默垄,由編譯程序自動(dòng)完成其他細(xì)節(jié)此虑。在定義注解時(shí),不能繼承其他的注解或接口口锭。@interface用來(lái)聲明一個(gè)注解朦前,其中的每一個(gè)方法實(shí)際上是聲明了一個(gè)配置參數(shù)。方法的名稱就是參數(shù)的名稱鹃操,返回值類型就是參數(shù)的類型(返回值類型只能是基本類型韭寸、Class、String荆隘、enum)恩伺。可以通過(guò)default來(lái)聲明參數(shù)的默認(rèn)值椰拒。
自定義注解注解參數(shù)支持?jǐn)?shù)據(jù)類型
- 四類八種數(shù)據(jù)類型
- String
- enum
- class
- Annotation
注意:自定義注解參數(shù)值不可為空晶渠,必須是確定的,當(dāng)只有一個(gè)值時(shí)燃观,用value作為名字褒脯。自定義注解只能被public和默認(rèn)的權(quán)限修飾符所修飾。
另外缆毁,自定義注解通常會(huì)用來(lái)傳參番川,在自定義的注解中放入值,然后通過(guò)反射獲取所有注解值在傳遞到某些方法中脊框。在學(xué)習(xí)javaweb項(xiàng)目過(guò)程中颁督,配置servlet文件時(shí)可以用注解直接進(jìn)行配置,最后在注解中的值就是訪問(wèn)的url缚陷,這個(gè)值就是作為參數(shù)進(jìn)行傳遞适篙。
參考代碼:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(value={ElementType.FIELD,ElementType.TYPE,ElementType.METHOD})
@Retention(value=RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String name();
String value(); //用來(lái)創(chuàng)建參數(shù)
}
package com.annotation;
@MyAnnotation(name="kevin", value = "576")
public class User {
@MyAnnotation(name = "Jack", value = "123")
private String username;
private String password;
public User() {
super();
}
public User(String username, String password) {
super();
this.username = username;
this.password = password;
}
@MyAnnotation(name = "tom", value = "456")
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + "]";
}
}
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
public class AnnotationTest {
public static void main(String[] args) throws NoSuchFieldException, SecurityException {
// TODO Auto-generated method stub
User user = new User();
Class clazz = user.getClass();
Annotation[] annotation = clazz.getAnnotations();//獲取類中所有注解
for (Annotation annotation2 : annotation) { //進(jìn)行遍歷
System.out.println(annotation2.annotationType());
}
Field field = clazz.getDeclaredField("username"); //獲取指定屬性上的注解并得到值
MyAnnotation annotation1 = field.getAnnotation(MyAnnotation.class);
System.out.println(annotation1.value());
}
}
注解處理器
有待補(bǔ)充。箫爷。嚷节。。