成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

Android編譯期代碼生成之a(chǎn)pt實(shí)踐入門(mén)

ls0609 / 859人閱讀

摘要:執(zhí)行完成之后,在的目錄下,即可看到咱們的代碼,如圖總結(jié)代碼的生成是定義編譯期的注解,再通過(guò)繼承實(shí)現(xiàn)代碼生成邏輯,實(shí)現(xiàn)了編譯期生成代碼的邏輯。學(xué)習(xí)資料附上一篇標(biāo)準(zhǔn)的編譯期代碼生成,以及關(guān)于的詳細(xì)介紹。

現(xiàn)在 Android 主流庫(kù)中使用 apt 的越來(lái)越多,如Dagger2,ButterKnife,DBflow等。不研究一下其怎么玩的,心里實(shí)在是不舒服斯基,所以就有了這篇apt代碼簡(jiǎn)單生成的文章。文章的末尾,會(huì)附上一些關(guān)于注解的基礎(chǔ)知識(shí),有興趣的童鞋可以再去看看。

Annotation庫(kù)-定義注解

首先,我們得需要新建一個(gè)名稱(chēng)為annotation的Java Library。這里簡(jiǎn)單的建一個(gè)@interfact的注解類(lèi)即可。如下:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.CLASS)
public @interface Test {
    String value();
}

可以看到的是,這是編譯時(shí)期的注解,主要作用于Class。之后,在調(diào)用的地方就是需要使用我們的這個(gè)注解。

Compiler庫(kù)-注解處理器 1.使用庫(kù)引入

這里,也使用的是Java Library,我們把報(bào)名定為 compiler,先定義gradle文件:

apply plugin: "java"

sourceCompatibility = 1.7
targetCompatibility = 1.7

dependencies {
    compile "com.google.auto.service:auto-service:1.0-rc2"
    compile "com.squareup:javapoet:1.7.0"
    compile project(":annotation")
}

代碼中,引入兩個(gè)庫(kù),AutoService主要的作用是注解processor類(lèi),并對(duì)其生成 META-INF 的配置信息。

JavaPoet這個(gè)庫(kù)的主要作用就是幫助我們通過(guò)類(lèi)調(diào)用的形式來(lái)生成代碼。

2. 定義Processor類(lèi)

建立一個(gè)名稱(chēng)為TestProcessor的類(lèi),如下:

@AutoService(Processor.class)
public class TestProcessor extends AbstractProcessor {

    @Override
    public Set getSupportedAnnotationTypes() {
        return Collections.singleton(Test.class.getCanonicalName());
    }

    @Override
    public boolean process(Set annotations, RoundEnvironment roundEnv) {
        return false;
    }
}

其中要注意的是使用AutoSerivce的注解,這樣就不用再手動(dòng)配置 META-INF文件了。方法getSupportedAnnotationTypes則是定義我們針對(duì)生成的注解類(lèi),方法process則是我們的重頭戲,其中則是我們生成代碼的主要邏輯之處:

@Override
public boolean process(Set annotations, RoundEnvironment roundEnv) {
  Set set = roundEnv.getElementsAnnotatedWith(Test.class);
  for (Element element : set) {
    if (element.getKind() != ElementKind.CLASS) {
      processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "only support class");
    }
    MethodSpec main = MethodSpec.methodBuilder("main")
      .addModifiers(Modifier.PUBLIC, Modifier.STATIC)
      .returns(void.class)
      .addParameter(String[].class, "args")
      .addStatement("$T.out.println($S)", System.class, "Hello, JavaPoet!")
      .build();

    TypeSpec helloWorld =
      TypeSpec.classBuilder("HelloWorld").addModifiers(Modifier.PUBLIC, Modifier.FINAL).addMethod(main).build();
    JavaFile javaFile = JavaFile.builder("com.lighters.apt", helloWorld).build();

    try {
      javaFile.writeTo(processingEnv.getFiler());
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  return false;
}

這里簡(jiǎn)單使用JavaPoet文檔中的第一個(gè)example, 生成一個(gè)簡(jiǎn)單的HelloWorld類(lèi)。大家可自己行去查看JavaPoet的更多用法,支持各種姿勢(shì)生成Java的代碼,并與Processor完美契合。

代碼調(diào)用

準(zhǔn)備工作都完成之后,接下來(lái)就在我們的主目錄app下面,通過(guò)添加注解,來(lái)查看我們的代碼生成邏輯。

1.添加依賴(lài)

在根目錄的build.gradle文件中的dependencies節(jié)點(diǎn)下面添加如下代碼:

classpath "com.neenbedankt.gradle.plugins:android-apt:1.8" 

app的build.gradle中添加如下代碼:

apply plugin: "com.neenbedankt.android-apt"
dependencies {
    compile project(":annotation")
    apt project(":compiler")
}
2.添加注解

這里,就偷一個(gè)小懶,在MainActivity上,添加注解Test,格式如下:

@Test("haha")
public class MainActivity extends AppCompatActivity {
}
3.代碼生成

注意,這里定義的注解為編譯期的注解,所以代碼的生成,只需要通過(guò)執(zhí)行Rebuild即可。執(zhí)行完成之后,在app的build/generated/source/apt目錄下,即可看到咱們的代碼,如圖:

總結(jié)

apt代碼的生成是定義編譯期的注解,再通過(guò)繼承Proccesor實(shí)現(xiàn)代碼生成邏輯,實(shí)現(xiàn)了編譯期生成代碼的邏輯。相對(duì)于在運(yùn)行期通過(guò)反射來(lái)說(shuō),提高了程序的運(yùn)行速度。這里只是簡(jiǎn)單引導(dǎo)大家搭建自己的apt處理器,更多的內(nèi)容期待大家各自玩出花來(lái)。

學(xué)習(xí)資料

附上一篇標(biāo)準(zhǔn)的編譯期代碼生成,以及trinea關(guān)于annotation的詳細(xì)介紹。

Annotation實(shí)戰(zhàn)【自定義AbstractProcessor】

Java Annotation 及幾個(gè)常用開(kāi)源項(xiàng)目注解原理簡(jiǎn)析

另外,使用apt的代碼庫(kù)Dagger2, Butterknife大家可自行深入研究了。

轉(zhuǎn)載請(qǐng)注明原文鏈接: http://alighters.com/blog/2016/05/10/apt-code-generate/

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/65914.html

相關(guān)文章

  • 關(guān)于Apt注解實(shí)踐與總結(jié)【包含20篇博客】

    摘要:使用實(shí)現(xiàn)功能運(yùn)行期注解案例使用簡(jiǎn)單的注解,便可以設(shè)置布局,等效于使用實(shí)現(xiàn)路由綜合型案例比較全面的介紹從零起步,一步一步封裝簡(jiǎn)易的路由開(kāi)源庫(kù)。申明注解用的就是。返回值表示這個(gè)注解里可以存放什么類(lèi)型值。 YCApt關(guān)于apt方案實(shí)踐與總結(jié) 目錄介紹 00.注解系列博客匯總 01.什么是apt 02.annotationProcessor和apt區(qū)別 03.項(xiàng)目目錄結(jié)構(gòu) 04.該案例作用 ...

    gnehc 評(píng)論0 收藏0
  • APT案例點(diǎn)擊事件

    摘要:楊充一定時(shí)間內(nèi)該點(diǎn)擊事件只能執(zhí)行一次用來(lái)修飾這是一個(gè)什么類(lèi)型的注解。楊充自定義編譯器獲取遍歷,并生成代碼配置文件文件配置的作用是向系統(tǒng)注冊(cè)自定義注解處理器,執(zhí)行編譯時(shí)使用進(jìn)行處理。 目錄介紹 01.創(chuàng)建項(xiàng)目步驟 1.1 項(xiàng)目搭建 1.2 項(xiàng)目功能 02.自定義注解 03.創(chuàng)建Processor 04.compiler配置文件 05.編譯jar 06.如何使用 07.編譯生成代...

    cyixlq 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<