閱讀了下 Retrofit 的源碼,非常喜歡它用注解來創(chuàng)建網(wǎng)絡(luò)請求。 通過Retrofit創(chuàng)建一個網(wǎng)絡(luò)請求非常方便,在注解里定義幾個參數(shù)就可以非常方便的創(chuàng)建出來一個Call用于請求網(wǎng)絡(luò)。
@POST("oauth2/token/")Call<AccessToken> getAccessToken(
@Field("username") String username,
@Field("password") String password,
@Field("grant_type") String grant_type,
@Field("scope") String scope,
@Field("client_id") String client_id
);
但是遺憾是它的注解都是在Runtime時候進(jìn)行解析的, 這樣的話就會用到反射,會影響我們執(zhí)行的效率。 于是我就想可不可以像ButterKnife那樣, 通過編譯時候來處理注解然后自動生成我們想要的代碼,這樣子就不會影響程序的執(zhí)行效率了。ButterKnife主要是通過創(chuàng)建一個Processor(繼承于AbstractProcessor) 來在編譯的時候來處理注解的, 然后再配合上JavaPoet 來生成自己想要的代碼。
Step1
需要創(chuàng)建一個javalib 依賴庫

然后在build.gradle加入AutoSerivce和JavaPoet依賴庫
compile 'com.google.auto:auto-common:0.6'
compile 'com.google.auto.service:auto-service:1.0-rc2'
compile 'com.squareup:javapoet:1.7.0'
創(chuàng)建一個processor類然后繼承abstractprocessor
@AutoService(Processor.class)
public class AutoProcessor extends AbstractProcessor
然后把你想處理的注解類注冊一下
private Set<Class<? extends Annotation>> getSupportedAnnotations() { Set<Class<? extends Annotation>> annotations = new LinkedHashSet<>(); annotations.add(GET.class);
annotations.add(POST.class);
annotations.add(GETParam.class);
annotations.add(POSTParam.class);
annotations.add(Package.class);
return annotations;
}
private String parseParamNameValue(String value) {
int length = value.indexOf("(");
String parsedValue = value.substring(0, length);
return parsedValue;
}
這時候你可以在process函數(shù)里去處理相應(yīng)的注解了。
Step2
如果想在編譯時候調(diào)試代碼
需要在gradle.properties里加入
org.gradle.daemon=true
org.gradle.jvmargs=agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5007
然后啟動一個remote調(diào)試,配置上跟你properties相應(yīng)的端口號

這時候通過terminal進(jìn)入你項目的目錄下
通過gradle啟動daemon進(jìn)程
輸入gradle daemon
當(dāng)守護(hù)進(jìn)程啟動起來后, debug剛剛創(chuàng)建的remote進(jìn)行調(diào)試,接下來在你的代碼上打上斷點
最后輸入gradle clean assembleDebug進(jìn)行編譯, 這時候會在你打的斷點上停下來。

配置gradle環(huán)境變量
sudo vim ~/.bash_profile
GRADE_HOME=/Users/Admin/gradle;
export GRADE_HOME
export PATH=/opt/local/bin:/opt/local/sbin:$PATH:$GRADE_HOME/bin