最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaPoet的使用指南小結(jié)

 更新時間:2018年10月19日 15:07:43   作者:Vander丶  
這篇文章主要介紹了JavaPoet的使用指南小結(jié),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

前言

對于我來說,JavaPoet也是不經(jīng)意間發(fā)現(xiàn)的,日常Android開發(fā)中:

主要使用Mvp+RxJava+Dagger2這套框架

在這套框架里每次寫 Activity 或者 Fragment 就會寫一套Mvp+Compent+Module,如下圖:

生成內(nèi)容.jpeg

經(jīng)過長時間的重復編寫,發(fā)現(xiàn)這一套Mvp+Compent+Module文件,只有名稱是變化的,所以只需要將名稱抽象出來,其他只需模板化,就能生成出上述Java文件.

正當想怎么能夠快捷生成Java文件,這時JavaPoet便出現(xiàn),而且JavaPoet能夠完全滿足需求。

本文主要以JavaPoet的使用方法介紹為主,會將JavaPoet的基本API都介紹一遍,你也可以理解成JavaPoet的中文簡易教程

JavaPoet的基本介紹

(1)JavaPoet是一款可以自動生成Java文件的第三方依賴

(2)簡潔易懂的API,上手快

(3)讓繁雜、重復的Java文件,自動化生成,提高工作效率,簡化流程

JavaPoet的小試牛刀

為了展示JavaPoet的能力,這里以自動生成一個全新的MainActivity為例。

public class MainActivity extends Activity{

  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
  }
}

我在使用JavaPoet的時候,習慣從外向內(nèi)逐一生成,但是這不是標準,這里可以按照自己的方式來理解和生成.

public static void main(String[] args) {
    ClassName activity = ClassName.get("android.app", "Activity");

    TypeSpec.Builder mainActivityBuilder = TypeSpec.classBuilder("MainActivity")
        .addModifiers(Modifier.PUBLIC)
        .superclass(activity);

    ClassName override = ClassName.get("java.lang", "Override");

    ClassName bundle = ClassName.get("android.os", "Bundle");

    ClassName nullable = ClassName.get("android.support.annotation", "Nullable");

    ParameterSpec savedInstanceState = ParameterSpec.builder(bundle, "savedInstanceState")
        .addAnnotation(nullable)
        .build();

    MethodSpec onCreate = MethodSpec.methodBuilder("onCreate")
        .addAnnotation(override)
        .addModifiers(Modifier.PROTECTED)
        .addParameter(savedInstanceState)
        .addStatement("super.onCreate(savedInstanceState)")
        .addStatement("setContentView(R.layout.activity_main)")
        .build();

    TypeSpec mainActivity = mainActivityBuilder.addMethod(onCreate)
        .build();

    JavaFile file = JavaFile.builder("com.test", mainActivity).build();

    try {
      file.writeTo(System.out);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

通過在Main方法中運行以上的代碼,就可以直接生成出MainActivity對象,自上而下的觀察上述代碼,你會發(fā)現(xiàn)JavaPoet讓java文件變得有邏輯性。

JavaPoet的常用類

  •  TypeSpec————用于生成類、接口、枚舉對象的類
  • MethodSpec————用于生成方法對象的類
  • ParameterSpec————用于生成參數(shù)對象的類
  • AnnotationSpec————用于生成注解對象的類
  • FieldSpec————用于配置生成成員變量的類
  • ClassName————通過包名和類名生成的對象,在JavaPoet中相當于為其指定Class
  • ParameterizedTypeName————通過MainClass和IncludeClass生成包含泛型的Class
  • JavaFile————控制生成的Java文件的輸出的類

 JavaPoet的常用方法

設置修飾關鍵字

addModifiers(Modifier... modifiers)

Modifier是一個枚舉對象,枚舉值為修飾關鍵字Public、Protected、Private、Static、Final等等。

所有在JavaPoet創(chuàng)建的對象都必須設置修飾符(包括方法、類、接口、枚舉、參數(shù)、變量)。

設置注解對象

addAnnotation(AnnotationSpec annotationSpec)
addAnnotation(ClassName annotation)
addAnnotation(Class<?> annotation)

該方法即為類或方法或參數(shù)設置注解,參數(shù)即可以是AnnotationSpec,也可以是ClassName,還可以直接傳遞Class對象。

一般情況下,包含復雜屬性的注解一般用AnnotationSpec,如果單純添加基本注解,無其他附加屬性可以直接使用ClassName或者Class即可。

設置注釋

addJavadoc(CodeBlock block)
addJavadoc(String format, Object... args)

在編寫類、方法、成員變量時,可以通過addJavadoc來設置注釋,可以直接傳入String對象,或者傳入CodeBlock(代碼塊)。

JavaPoet生成類、接口、枚舉對象

在JavaPoet中生成類、接口、枚舉,必須得通過TypeSpec生成,而classBuilder、interfaceBuilder、enumBuilder便是創(chuàng)建其關鍵的方法:

創(chuàng)建類:
TypeSpec.classBuilder("類名“) 
TypeSpec.classBuilder(ClassName className)

創(chuàng)建接口:
TypeSpec.interfaceBuilder("接口名稱")
TypeSpec.interfaceBuilder(ClassName className)

創(chuàng)建枚舉:
TypeSpec.enumBuilder("枚舉名稱")
TypeSpec.enumBuilder(ClassName className)

繼承、實現(xiàn)接口

繼承類:
.superclass(ClassName className)

實現(xiàn)接口
.addSuperinterface(ClassName className)

繼承存在泛型的父類

當繼承父類存在泛型時,需要使用ParameterizedTypeName

ParameterizedTypeName get(ClassName rawType, TypeName... typeArguments)

返回的ParameterizedTypeName對象,已經(jīng)被添加泛型信息

方法

addMethod(MethodSpec methodSpec)

通過配置MethodSpec對象,使用addMethod方法將其添加進TypeSpec中。

枚舉

addEnumConstan(String enumValue)

通過addEnumConstan方法添加枚舉值,參數(shù)為枚舉值名稱。

JavaPoet生成成員變量

JavaPoet生成成員變量是通過FieldSpec的build方法生成.

builder(TypeName type, String name, Modifier... modifiers)

只要傳入TypeName(Class)、name(名稱)、Modifier(修飾符),就可以生成一個基本的成員變量。

成員變量一般來說由注解(Annotation)、修飾符(Modifier)、Javadoc(注釋)、initializer(實例化)。

注解

addAnnotation(TypeName name)

修飾符

addModifiers(Modifier ...modifier)

注釋

addJavadoc(String format, Object... args)

由于上述三個方法,都在通用方法介紹過這里就不再重復介紹。

實例化

initializer(String format, Object... args)

即成員變量的實例化,例:

public Activity mActivity = new Activity;

initializer方法中的內(nèi)容就是“=”后面的內(nèi)容 ,下面看下具體的代碼實現(xiàn),上面的成員變量:

ClassName activity = ClassName.get("android.app", "Activity");
 FieldSpec spec = FieldSpec.builder(activity, "mActivity")
        .addModifiers(Modifier.PUBLIC)
        .initializer("new $T", activity)
        .build();

JavaPoet生成方法

JavaPoet生成方法分為兩種,第一種是構(gòu)造方法,另一種為常規(guī)的方法。

構(gòu)造方法

MethodSpec.constructorBuilder()

常規(guī)方法

MethodSpec.methodBuilder(String name)

方法的主要構(gòu)成有方法參數(shù)、注解、返回值、方法體、拋出異常五種,注解可以參考通用方法addAnnotation,其他方法我們將會一一介紹:

方法參數(shù)

addParameter(ParameterSpec parameterSpec)

設置方法參數(shù)的方法通過addParameterSpec來實現(xiàn),ParameterSpec的具體使用參考下一小節(jié)。

返回值

returns(TypeName returnType)

設置方法的返回值,只需傳入一個TypeName對象,而TypeName是ClassName,ParameterizedTypeName的基類。

方法體

在JavaPoet中,設置方法體內(nèi)容有兩個方法,分別是addCode和addStatement:

addCode()
addStatement()

這兩個本質(zhì)上都是設置方法體內(nèi)容,但是不同的是使用addStatement()方法時,你只需要專注于該段代碼的內(nèi)容,至于結(jié)尾的分號和換行它都會幫你做好。

而addCode()添加的方法體內(nèi)容就是一段無格式的代碼片,需要開發(fā)者自己添加其格式。

方法體模板

在JavaPoet中,設置方法體使用模板是比較常見的,因為addCode和addStatement方法都存在這樣的一個重載:

addCode(String format, Object... args)

addStatement(String format, Object... args)

在JavaPoet中,format中存在三種特定的占位符:

$T

$T 在JavaPoet代指的是TypeName,該模板主要將Class抽象出來,用傳入的TypeName指向的Class來代替。

ClassName bundle = ClassName.get("android.os", "Bundle");
addStatement("$T bundle = new $T()",bundle)

上述添加的代碼內(nèi)容為:

Bundle bundle = new Bundle();

$N

$N在JavaPoet中代指的是一個名稱,例如調(diào)用的方法名稱,變量名稱,這一類存在意思的名稱

addStatement("data.$N()",toString)

上述代碼添加的內(nèi)容:

data.toString();

$S

$S在JavaPoet中就和String.format中%s一樣,字符串的模板,將指定的字符串替換到$S的地方

.addStatement("super.$S(savedInstanceState)","onCreate")

即將"onCreate"字符串代替到$S的位置上.

拋出異常

.addException(TypeName name)

設置方法拋出異常,可以使用addException方法,傳入指定的異常的ClassName,即可為該方法設置其拋出該異常.

JavaPoet生成方法參數(shù)

JavaPoet生成有參方法時,需要填充參數(shù),而生成參數(shù)則需要通過ParameterSpec這個類。

addParameter(ParameterSpec parameterSpec)

初始化ParameterSpec

ParameterSpec.builder(TypeName type, String name, Modifier... modifiers)

給參數(shù)設置其Class,以及參數(shù)名稱,和修飾符.

通常來說參數(shù)的構(gòu)成包括:參數(shù)的類型(Class)、參數(shù)的名稱(name)、修飾符(modifiers)、注解(Annotation)

除了builder方法初始化類型、以及名稱、修飾符之外,其余可以通過如下方法進行設置:

添加修飾符

.addModifiers(Modifier modifier)

添加注解

addAnnotation(TypeName name) 

添加修飾符、注解具體使用可參考通用方法。

JavaPoet生成注解

在JavaPoet創(chuàng)建類、成員變量、方法參數(shù)、方法,都會用到注解。

如果使用不包含屬性的注解可以直接通過

  .addAnnotation(TypeName name)

直接傳入TypeName或者Class進行設置。

如果使用的注解包含屬性,并且不止一個時,這時候就需要生成AnnotationSpec來解決,下面簡單了解下AnnotationSpec。

初始化AnnotationSpec

AnnotationSpec.builder(ClassName type)

可以發(fā)現(xiàn)初始化,只需傳入ClassName或者Class即可。

設置屬性

addMember(String name, String format, Object... args)

使用addMember可以設置注解的屬性值,name對應的就是屬性名稱,format的內(nèi)容即屬性體,同樣方法體的格式化在這里也是適用的。

JavaPoet如何生成代碼

如果上述內(nèi)容你已經(jīng)看完,那么恭喜你,你已經(jīng)明白JavaPoet的意圖,但是現(xiàn)在的你,還差最后一步,即如何生成代碼。

JavaPoet中負責生成的類是JavaFile

JavaFile.builder(String packageName, TypeSpec typeSpec)

JavaFile通過向build方法傳入PackageName(Java文件的包名)、TypeSpec(生成的內(nèi)容)生成。

打印結(jié)果

javaFile.writeTo(System.out)

生成的內(nèi)容會輸出到控制臺中

生成文件

javaFile.writeTo(File file)

生成的內(nèi)容會以java文件的方式,存放到你傳入File文件的位置

結(jié)束語

當你讀完了本文,如果你產(chǎn)生下面的想法:

  • JavaPoet原來還可以這樣
  •  JavaPoet編寫過程為什么那么流暢,原來Java文件也可以用編程的方式生成
  • JavaPoet可不可以改進我的編碼流程,提升效率

那么說明你已經(jīng)對JavaPoet感興趣了,可以自己動手嘗試一下,感受下JavaPoet的魅力。

最后貼一張,JavaPoet秘籍,有了它會很好的幫助你使用JavaPoet.

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Spring Security  整體架構(gòu)操作流程

    Spring Security  整體架構(gòu)操作流程

    這篇文章主要介紹了Spring Security  整體架構(gòu)操作流程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-07-07
  • java線程并發(fā)blockingqueue類使用示例

    java線程并發(fā)blockingqueue類使用示例

    BlockingQueue是一種特殊的Queue,若BlockingQueue是空的,從BlockingQueue取東西的操作將會被阻斷進入等待狀態(tài)直到BlocingkQueue進了新貨才會被喚醒,下面是用BlockingQueue來實現(xiàn)Producer和Consumer的例子
    2014-01-01
  • Java定時任務ScheduledThreadPoolExecutor示例詳解

    Java定時任務ScheduledThreadPoolExecutor示例詳解

    這篇文章主要介紹了Java定時任務ScheduledThreadPoolExecutor示例詳解,這里使用scheduleAtFixedRate方法安排一個任務,該任務是一個 Runnable 匿名類,其run方法中調(diào)用了new LoginViewTimeTask().loginStatisticsHandle()方法,需要的朋友可以參考下
    2023-11-11
  • springboot配置數(shù)據(jù)庫密碼特殊字符報錯的解決

    springboot配置數(shù)據(jù)庫密碼特殊字符報錯的解決

    這篇文章主要介紹了springboot配置數(shù)據(jù)庫密碼特殊字符報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • java  List循環(huán)與Map循環(huán)的總結(jié)

    java List循環(huán)與Map循環(huán)的總結(jié)

    這篇文章主要介紹了java List循環(huán)與Map循環(huán)的總結(jié)的相關資料,并附代碼實例,幫助大家學習理解,需要的朋友可以參考下
    2016-11-11
  • java 下執(zhí)行mysql 批量插入的幾種方法及用時

    java 下執(zhí)行mysql 批量插入的幾種方法及用時

    java 下執(zhí)行mysql 批量插入的幾種方法及用時,1000次插入方法的比較。
    2013-04-04
  • Java中輸出字符的ASCII值實例

    Java中輸出字符的ASCII值實例

    這篇文章主要介紹了Java中輸出字符的ASCII值實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • @PathVariable、@RequestParam和@RequestBody的區(qū)別

    @PathVariable、@RequestParam和@RequestBody的區(qū)別

    本文主要介紹了@PathVariable、@RequestParam和@RequestBody的區(qū)別和使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-05-05
  • Java異常處理及自定義異常詳細指南

    Java異常處理及自定義異常詳細指南

    異常處理是Java編程中的一個重要部分,用于處理程序執(zhí)行中出現(xiàn)的異常情況,此外還可以自定義異常來處理特定的錯誤情況,掌握這些異常處理技術對于編寫健壯、可靠的Java程序至關重要,需要的朋友可以參考下
    2024-10-10
  • 詳解使用Spring Security進行自動登錄驗證

    詳解使用Spring Security進行自動登錄驗證

    本篇文章主要介紹了詳解使用Spring Security進行自動登錄驗證,非常具有實用價值,需要的朋友可以參考下
    2017-09-09

最新評論

安多县| 双柏县| 册亨县| 博爱县| 焉耆| 平塘县| 三穗县| 文山县| 小金县| 江阴市| 威宁| 中江县| 如皋市| 清水县| 甘肃省| 安吉县| 通州区| 浦城县| 乐都县| 辽源市| 天柱县| 景东| 遂川县| 林周县| 龙井市| 崇左市| 南和县| 霍林郭勒市| 布尔津县| 临泉县| 广南县| 西充县| 高台县| 玛多县| 富川| 黄山市| 婺源县| 丰城市| 寿光市| 随州市| 瑞金市|