閱讀了下 Retrofit 的源碼,非常喜歡它用注解來創建網絡請求。 通過Retrofit創建一個網絡請求非常方便,在注解里定義幾個參數就可以非常方便的創建出來一個Call用于請求網絡。
@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時候進行解析的, 這樣的話就會用到反射,會影響我們執行的效率。 于是我就想可不可以像ButterKnife那樣, 通過編譯時候來處理注解然后自動生成我們想要的代碼,這樣子就不會影響程序的執行效率了。ButterKnife主要是通過創建一個Processor(繼承于AbstractProcessor) 來在編譯的時候來處理注解的, 然后再配合上JavaPoet 來生成自己想要的代碼。
Step1
需要創建一個javalib 依賴庫
創建lib庫
然后在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'
創建一個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函數里去處理相應的注解了。
Step2
如果想在編譯時候調試代碼
需要在gradle.properties里加入
org.gradle.daemon=true
org.gradle.jvmargs=agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5007
然后啟動一個remote調試,配置上跟你properties相應的端口號
調試
這時候通過terminal進入你項目的目錄下
通過gradle啟動daemon進程
輸入gradle daemon
當守護進程啟動起來后, debug剛剛創建的remote進行調試,接下來在你的代碼上打上斷點
最后輸入gradle clean assembleDebug進行編譯, 這時候會在你打的斷點上停下來。
如圖所示
配置gradle環境變量
sudo vim ~/.bash_profile
GRADE_HOME=/Users/Admin/gradle;
export GRADE_HOME
export PATH=/opt/local/bin:/opt/local/sbin:$PATH:$GRADE_HOME/bin