AS 運行 Annotation
注解分為運行時注解和編譯時注解
運行時注解
原理就是反射和代理(Proxy )
編譯時注解
通過apt(Annotation Processing Tools)
技術(shù),原理是在某些代碼元素上(如類型、函數(shù)、字段等)添加注解,在編譯時編譯器會檢查 AbstractProcessor
的子類,并且調(diào)用該類型的process
函數(shù),然后將添加了注解的所有元素都傳遞到process
函數(shù)中,使得開發(fā)人員可以在編譯器進行相應(yīng)的處理,
步驟
使用 AS 創(chuàng)建一個 Android 項目,然后創(chuàng)建一個 module,一定要選擇 java library
設(shè)置 app 的 build.gradle,在 android 下添加
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
在 java library 的 build.gradle 添加
sourceCompatibility = 1.7
targetCompatibility = 1.7
- 在 java library 創(chuàng)建注解類
package com.major;
public @interface CustomAnnotation {
}
- 創(chuàng)建注解處理器
package com.major;
import java.util.Set;
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.annotation.processing.SupportedSourceVersion;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.TypeElement;
@SupportedAnnotationTypes("com.major.CustomAnnotation")
@SupportedSourceVersion(SourceVersion.RELEASE_7)
public class CustomAnnotationProcessor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnv) {
// doSomething
return true;
}
}
- 創(chuàng)建 resources 告訴編譯器在編譯的時候使用哪個注解處理器
- 在 java library 的 main 目錄下創(chuàng)建文件
resources/META-INF/services/javax.annotation.processing.Processor
- 在文件中填寫處理器路徑
- 在 java library 的 main 目錄下創(chuàng)建文件
com.major.CustomAnnotationProcessor
- 在 project 的 build.gradle 的 dependencies 添加 apt 插件
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
- 編輯 app build.gradle
- 添加 插件
apply plugin: 'com.neenbedankt.android-apt'
- 在 dependencies 添加依賴
compile files('libs/processor.jar')
- 創(chuàng)建 task 將把生成的 jar 文件復制到 app/libs 目錄中
task processorTask(type: Copy) {
from('../processor/build/libs/processor.jar')
into('libs/')
}
processorTask.dependsOn(':processor:build')
preBuild.dependsOn(processorTask)
rebuild,然后可以在 app/libs 下看到生成的 lib 包
在 app 中調(diào)用注解
注:
- Q: 如何獲取 java library 的 jar 包?
A: 使用 app 依賴 java library 的模塊,然后可在 build/libs/ 下找到 jar 包
AnnotationProcessor 中調(diào)試代碼(未驗證)
- 設(shè)置gradle daemon端口和JVM參數(shù)。把下面兩行加入到你的gradle.properties文件。
org.gradle.daemon=true
org.gradle.jvmargs=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
- 運行命令 gradle daemon 來啟動守護線程。
gradle --daemon
在 process 方法中打斷點
建立 Remote Debugger
Edit Configurations --> + --> Remote --> 填寫 host, port --> finish --> 點擊 debug 按鈕