上一篇博客討論了關(guān)于注解的基礎(chǔ)知識,以及運(yùn)行時(Runtime)通過反射機(jī)制來處理注解,但既然是Runtime,那么總會有效率上的損耗,如果我們能夠在編譯期(Compile time)就能處理注解,那自然更好,而很多框架其實都是在編譯期處理注解,比如大名鼎鼎的bufferknife,這個過程并不復(fù)雜,只需要我們自定義注解處理器(Annotation Processor)就可以了。(Annotation Processor下文有些地方直接簡稱處理器,不要理解成cpu那個處理器)。
在Compile time注解就能起作用,這才是真正體現(xiàn)注解價值的地方,不過自定義Compile time的注解處理器也沒什么神秘的。注解處理器是編譯器(javac)的一個工具,它用來在編譯時掃描和處理注解。我們可以自定義一個注解,并編寫和注冊對應(yīng)的處理器。在寫法上它其實就是我們自定義一個類,該類 extends javax.annotation.processing.AbstractProcessor
, AbstractProcessor
是一個abstract的基類。它以我們寫好的java源碼或者編譯好的代碼做為輸入,然后就可以通過處理器代碼來實現(xiàn)我們所希望的輸出了,比如輸出一份新的java代碼,此時注解管理器就以遞歸的形式進(jìn)行多趟處理,直到把代碼(包括你手寫的代碼,以及注解處理器生成的代碼)中所有的注解都被處理完畢。
我們已經(jīng)寫好的代碼固然是不能修改了,但是這并不影響通過注解處理器來生成新的代碼。還以bufferknife為例,寫findViewById實在太無聊了,所以我們就使用了bufferknife的注解方式省略這個過程。
public class TestMainActivity extends BaseActivity { @BindView(R.id.mainSwitchGoneBtn) Button goneBtn; ....... }
但是實際上呢,是bufferknife通過其注解處理器器來生成了相應(yīng)的代碼,它生成的文件是這樣的:
網(wǎng)友評論