1.反射(Reflection):讓我們?cè)谶\(yùn)行時(shí)獲取類的屬性、方法何乎、構(gòu)造方法句惯、父類土辩、接口等信息。
2.注解(Annotation jdk1.5引入):對(duì)程序代碼本身的描述-代碼元數(shù)據(jù)抢野,一種約定的規(guī)范拷淘,包括格式、意義指孤、作用域等.
3.依賴注入(dependency injection/DI):它的底層實(shí)現(xiàn)有多種方法启涯,而注解是其常用的方法。
4.控制反轉(zhuǎn)(inversion of control/IOC):它的底層實(shí)現(xiàn)有多種方法恃轩,其中DI是其常用的方法结洼,還有一種是依賴查找(Dependency Lookup)。
所以這里重點(diǎn)說(shuō)一下注解叉跛。
運(yùn)行機(jī)制分
1.源碼注解(RetentionPolicy.source):只在源碼中存在松忍,編譯后不存在。
2.編譯時(shí)注解(RetentionPolicy.class):動(dòng)態(tài)生成代碼筷厘,源碼和編譯后的class文件都存在(如@Override,@Deprecated,@SuppressWarnings),如ButterKnife鸣峭,dagger2,greendao敞掘。
3.運(yùn)行時(shí)注解(RetentionPolicy.runtime):獲取注解信息,能在程序運(yùn)行時(shí)起作用(如Retrofit叽掘,eventbus)。
按來(lái)源分
1.java元注解(meta-annotation):注解的注解玖雁,@Target、@Retention盖腕、@Documented赫冬、@Inherited
2.java基本內(nèi)置注解:@Override,@Deprecated,@SuppressWarnings
3.自定義/第三方的注解:需要在元注解的基礎(chǔ)上自定義。
所以我們得重點(diǎn)理解四個(gè)元注解的作用:
1.@Retention:標(biāo)記所修飾對(duì)象的時(shí)期溃列【⒀幔可能的值是:
SOURCE:表明這個(gè)注解會(huì)被編譯器忽略,并只會(huì)保留在源代碼中听隐。
CLASS:表明這個(gè)注解會(huì)通過(guò)編譯駐留在CLASS文件补鼻,但會(huì)被JVM在運(yùn)行時(shí)忽略,正因?yàn)槿绱?其在運(yùn)行時(shí)不可見(jiàn)。
RUNTIME:表示這個(gè)注解會(huì)被JVM獲取雅任,并在運(yùn)行時(shí)通過(guò)反射獲取风范。
2.@Target:所修飾對(duì)象的范圍,共8種。例如:
ANNOTATION_TYPE 表示該注解可以應(yīng)用到其他注解上
CONSTRUCTOR 表示可以使用到構(gòu)造器上
FIELD 表示可以使用到域或?qū)傩陨?br>
LOCAL_VARIABLE表示可以使用到局部變量上沪么。
METHOD可以使用到方法級(jí)別的注解上硼婿。
PACKAGE可以使用到包聲明上。
PARAMETER可以使用到方法的參數(shù)上
TYPE可以使用到一個(gè)類的任何元素上禽车。
@Documented:被注解的元素將會(huì)作為Javadoc產(chǎn)生的文檔中的內(nèi)容寇漫。注解都默認(rèn)不會(huì)成為成為文檔中的內(nèi)容刊殉。這個(gè)注解可以對(duì)其它注解使用。
@Inherited:在默認(rèn)情況下州胳,注解不會(huì)被子類繼承记焊。被此注解標(biāo)記的注解會(huì)被所有子類繼承。這個(gè)注解可以對(duì)類使用栓撞。
作為Android開(kāi)發(fā)來(lái)講亚亲。除了理解javase部分的注解(也就是元注解和基本內(nèi)置注解)外,還要去理解ButterKnife腐缤,dagger2捌归,greendao,Retrofit岭粤,eventbus惜索。等常用框架的注解。