成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Android Studio中使用apt

移動(dòng)開發(fā) Android
你還在對(duì)著枯燥的重復(fù)代碼一味復(fù)制粘貼嗎?這樣跟搬磚有何區(qū)別?你是否曾想過(guò):你用代碼編寫出一個(gè)自動(dòng)化的APP,但為何代碼本身卻缺少了活力?掌握Android-apt,杜絕重復(fù)代碼,讓你寫代碼如寫詩(shī)般優(yōu)雅。

一、前言

你還在對(duì)著枯燥的重復(fù)代碼一味復(fù)制粘貼嗎?這樣跟搬磚有何區(qū)別?你是否曾想過(guò):你用代碼編寫出一個(gè)自動(dòng)化的APP,但為何代碼本身卻缺少了活力?掌握Android-apt,杜絕重復(fù)代碼,讓你寫代碼如寫詩(shī)般優(yōu)雅。

二、何為apt?

apt意為:annotation processing tool(注解處理工具),這家伙可神奇了,它能通過(guò)注解,在編譯期自動(dòng)生成特定的Java文件,實(shí)現(xiàn)自動(dòng)編寫代碼。

問(wèn):有什么用?憑我自己本事能寫出來(lái)的代碼,為什么要自動(dòng)化?

大哥,你這是又想施展你的復(fù)制粘貼大法了嗎?稍安勿躁,細(xì)看完這篇文章,你會(huì)愛(ài)上這家伙的。

鼎鼎大名的ButterKnife、Dagger2這兩個(gè)開源庫(kù),相信你一定有聽(tīng)過(guò),你應(yīng)該知道我為什么提到它們了吧。沒(méi)錯(cuò)!這兩個(gè)開源庫(kù)都是基于apt的。

三、說(shuō)了這么多,要怎么用啊?別急,我們先搭建環(huán)境(基于gradle插件2.2.0以上版本)

1.在android studio中新建一個(gè)Java module,用于存裝注解處理邏輯,名字隨便啦,反正我一般都取名:apt。很重要的事:在app module中添加注解處理依賴:annotationProcessor project(‘:apt’)

(解釋原因:由于android的module中不包含有apt相關(guān)類,因此需要新建一個(gè)java module來(lái)編寫apt邏輯。什么?你不信?不信你寫個(gè)類繼承AbstractProcessor試試)

 

2.再次新建一個(gè)module(android、java都可以),用于存裝注解,名字也隨便,反正我這里取名為:anno,并且在app、apt的build.gradle文件下,添加依賴compile project(‘:anno’)

(為什么要新建module去盛裝注解類,而不放到app module或者apt module中去:最主要的原因就是app module與apt module不能直接相互依賴,至于為什么不能直接依賴,我就不細(xì)說(shuō)了,總之一句話:不信你試試看就知道嘍!)

3.在apt的build.gradle里,添加如下依賴。到此,我們的環(huán)境配置工作就告一段落了。

 

(其中:1.auto-service是用于注解后自動(dòng)在特定路徑下生成配置文件;2.javapoet是用于配合apt便捷生成java文件的工具。相信這樣解釋大家還云里霧里,不要著急,繼續(xù)往下看)

四、環(huán)境搭建好了,接下來(lái)就是秀操作時(shí)間

1.首先,在anno module里新建一個(gè)注解類

  1. @Retention(RetentionPolicy.SOURCE) 
  2. @Target(ElementType.METHOD) 
  3. public @interface Test { 
  4.     String value(); 
  5.  

2.在apt module里新建一個(gè)注解處理類,繼承于AbstractProcessor

  1. public class TestProcessor extends AbstractProcessor{ 
  2.     @Override 
  3.     public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { 
  4.         return false
  5.     } 
  6.  

3.既然說(shuō)apt是要自動(dòng)生成java文件,那我們就需要擬構(gòu)出一個(gè)目標(biāo)類。假設(shè)我們要生成這樣一個(gè)類

  1. public class TestClass { 
  2.  
  3.     public static void main(String[] args){ 
  4.         System.out.println("Hallo world!"); 
  5.     } 
  6.  
  7.  

4.操作注解處理類,生成目標(biāo)java文件

  1. @AutoService(Processor.class) 
  2. @SupportedAnnotationTypes({ 
  3.         "com.aop.anno.Test" 
  4. }) 
  5. public class TestProcessor extends AbstractProcessor{ 
  6.  
  7.     @Override 
  8.     public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { 
  9.  
  10.         //生成TestClass類 
  11.         TypeSpec.Builder tb = TypeSpec.classBuilder("TestClass"
  12.                 .addModifiers(Modifier.PUBLIC); 
  13.  
  14.         //生成main方法 
  15.         MethodSpec.Builder mb = MethodSpec.methodBuilder("main"
  16.                 .addModifiers(Modifier.PUBLIC, Modifier.STATIC
  17.                 .returns(void.class) 
  18.                 .addParameter(String[].class, "args"); 
  19.  
  20.         //生成代碼塊,并添加到main方法中 
  21.         for(TypeElement e : ElementFilter.typesIn(roundEnv.getElementsAnnotatedWith(Test.class))){ 
  22.             CodeBlock cb = CodeBlock.builder() 
  23.                     .addStatement("$T.out.println(\"$L + $L\")", System.class,  
  24.                     e.getAnnotation(Test.class).value(), e.getSimpleName()) 
  25.                     .build(); 
  26.             mb.addCode(cb); 
  27.         } 
  28.  
  29.         tb.addMethod(mb.build()); 
  30.  
  31.         JavaFile jf = JavaFile.builder("com.example.apt", tb.build()).build(); 
  32.         //將代碼寫入java文件中 
  33.         try { 
  34.             jf.writeTo(processingEnv.getFiler()); 
  35.         } catch (IOException e) { 
  36.             e.printStackTrace(); 
  37.         } 
  38.  
  39.         return true
  40.     } 
  41.  

大致說(shuō)下步驟:

(1)添加@AutoService(Processor.class)注解,這個(gè)注解會(huì)自動(dòng)在指定路徑下生成一個(gè)配置文件:

apt/build/classes/main/META-INF/services/javax.annotation.processing.Processor;

(2)添加@SupportedAnnotationTypes注解,配置這個(gè)類所要處理的注解類型。(傳入String類型參數(shù),格式為:包名+類名);

(3)采用javapoet書寫代碼構(gòu)建邏輯,具體用法去這里看看;

(4)生成代碼塊的主要邏輯是:遍歷所有被@Test注解過(guò)的類,取出注解內(nèi)容及類名打印出來(lái)。

5.在類上添加@Test注解,這里就用MainActivity來(lái)試試

  1. @Test("abc"
  2. public class MainActivity extends AppCompatActivity { 
  3.  
  4.     @Override 
  5.     protected void onCreate(Bundle savedInstanceState) { 
  6.         super.onCreate(savedInstanceState); 
  7.         setContentView(R.layout.activity_main); 
  8.     } 
  9.  

6.rebuild工程,在app/build/generated/source/apt/debug路徑下找到目標(biāo)java文件。至此,大功告成   

 

TestClass代碼如下:

  1. public class TestClass { 
  2.   public static void main(String[] args) { 
  3.     System.out.println("abc + MainActivity"); 
  4.   } 
  5.  

五、然而并沒(méi)什么卵用?

確實(shí),到此為止,我們確實(shí)是用了幾十行代碼去生成了一個(gè)5行代碼的TestClass,這種操作來(lái)說(shuō)看起來(lái)可以用4個(gè)字來(lái)形容:閑得蛋疼。

然而,接下來(lái)的操作,會(huì)讓你耳目一新。首先我們新建幾個(gè)測(cè)試類,假如我們新建了這樣4個(gè)測(cè)試類:ActivityA,ActivityB,ActivityC,ActivityD,并且都給他們加上注解@Test。然后rebuild一下,你會(huì)發(fā)現(xiàn),我們的TestClass變了樣:

  1. public class TestClass { 
  2.   public static void main(String[] args) { 
  3.     System.out.println("A + ActivityA"); 
  4.     System.out.println("B + ActivityB"); 
  5.     System.out.println("C + ActivityC"); 
  6.     System.out.println("D + ActivityD"); 
  7.     System.out.println("abc + MainActivity"); 
  8.   } 

恍然大悟!原來(lái),是這么玩的!這時(shí)候,你是否已經(jīng)感覺(jué)到apt的魅力了呢?是的,它能幫你干掉重復(fù)代碼,讓你杜絕掉復(fù)制粘貼。 

責(zé)任編輯:龐桂玉 來(lái)源: Android開發(fā)中文站
相關(guān)推薦

2016-08-10 11:01:58

UbuntuLinuxShell

2020-11-04 18:13:24

DebianUbuntuapt-cache命令

2013-05-17 10:48:40

GoogleAndroid Stu

2013-01-07 13:54:17

Android開發(fā)JUnit單元測(cè)試

2014-06-24 10:34:08

Android Stu教程

2022-08-04 18:34:18

Ubuntuaptupgrade 命令

2022-07-25 10:20:39

apt 命令Ubuntu軟件包

2010-06-21 15:04:00

Linux apt

2020-12-15 10:20:48

Facebook攻擊惡意軟件

2013-03-28 10:34:29

2020-06-28 13:56:01

UbuntuAptSynaptic

2014-02-26 11:11:05

AndroidStudio開發(fā)環(huán)境

2014-07-17 11:36:27

Android Stu使用教程

2012-02-13 14:22:22

MonoTouchiOS應(yīng)用Visual Stud

2012-02-13 14:10:11

MonoTouchiOS應(yīng)用Visual Stud

2011-01-07 09:01:17

Visual Stud

2022-05-07 11:08:50

Linuxapt 命令

2023-12-22 09:11:45

AndroidNFC移動(dòng)開發(fā)

2012-12-27 13:04:17

Android開發(fā)SQLite數(shù)據(jù)庫(kù)

2011-11-16 10:25:34

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产精品一区二区免费 | 亚洲一区二区电影在线观看 | 69热视频在线观看 | 国产高清久久 | 色一情一乱一伦一区二区三区 | 99亚洲精品| 自拍视频网站 | 国产在线播放av | 国产精品毛片一区二区在线看 | 欧美日韩精品免费观看 | 男人天堂网址 | 国产特级毛片 | 欧美久久久电影 | 国产美女特级嫩嫩嫩bbb片 | 欧美综合久久久 | 欧美xxxx在线 | 欧美精品电影一区 | www.99热.com| 色婷婷激情综合 | 国产一级片免费在线观看 | 亚洲精品一区二区三区蜜桃久 | 亚洲精品99| 成人av一区| 精品真实国产乱文在线 | 国产日产精品一区二区三区四区 | 日韩福利电影 | 国产精品久久久久无码av | 国产精品久久一区二区三区 | 久久久国产精品视频 | 色婷婷九月 | 国产一区二区三区久久久久久久久 | 亚洲福利网| 久久精品亚洲精品 | av看看| 日韩av高清在线 | 国产成人综合亚洲欧美94在线 | 亚洲午夜精品一区二区三区他趣 | 色资源在线视频 | 成人在线精品视频 | 日一区二区三区 | 欧美8一10sex性hd |