一、简介

squareup开发一套动态生成java代码的框架。

// 依赖链接
implementation 'com.squareup:javapoet:1.11.1'

二、相关资料

https://segmentfault.com/a/1190000021177287

https://blog.csdn.net/wcs542882916/article/details/83117230(十分详细)

https://blog.csdn.net/l540675759/article/details/82931785

https://blog.csdn.net/alex_xfboy/article/details/88253799(不使用poet生成java代码的率直与痛苦)

https://www.jianshu.com/p/4c0fbe5b27a2

https://github.com/zhouphenix/Docs/blob/master/JavaPoet%E4%BD%BF%E7%94%A8%E8%AF%A6%E8%A7%A3.md(github上整理的poet详细语法)

https://blog.csdn.net/io_field/article/details/89355941

三、语法

1.占位

$L: 取变量字面量值替换之

假如你传递是字符串,生成的java代码会去掉字符串两端的引号。

$S:表示取变量字面量值加双引号后替换之

$T:表示类型,在生成代码时自动去import类型。

如何关联当前环境不存在的类:通过ClassName.get(包名,类名)

$N:用于关联声明,如关联某个方法名。

2.创建

一般简单类型可以直接写,复杂类型可以通过对应的build构建。

1)创建类

一般类:

TypeSpec helloWorld = TypeSpec.classBuilder("HelloWorld")
    .addModifiers(Modifier.PUBLIC, Modifier.FINAL)
    .addMethod(main)
    .build();

接口:

TypeSpec.interfaceBuilder("HelloWorld")

接口方法必须是PUBLIC ABSTRACT,接口属性必须是PUBLIC STATIC FINAL

2)创建类文件

JavaFile javaFile = JavaFile.builder("com.example.helloworld", helloWorld)
    .build();

3)创建方法

一般方法:

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();

构造方法:

MethodSpec.constructorBuilder()

参数:

在方法或构造函数上声明参数时,可以使用ParameterSpec.builder()MethodSpec的APIaddParameter()

ParameterSpec android = ParameterSpec.builder(String.class, "android")
    .addModifiers(Modifier.FINAL)
    .build();

MethodSpec welcomeOverlords = MethodSpec.methodBuilder("welcomeOverlords")
    .addParameter(android)
    .addParameter(String.class, "robot", Modifier.FINAL)
    .build();

4)添加属性

FieldSpec android = FieldSpec.builder(String.class, "android")
    .addModifiers(Modifier.PRIVATE, Modifier.FINAL)
    .build();

TypeSpec helloWorld = TypeSpec.classBuilder("HelloWorld")
    .addModifiers(Modifier.PUBLIC)
    .addField(android)
    .addField(String.class, "robot", Modifier.PRIVATE, Modifier.FINAL)
    .build();

5)枚举

TypeSpec.enumBuilder("Roshambo")

6)匿名内部类

TypeSpec.anonymousClassBuilder

7)注解

为方法添加注解:

MethodSpec.methodBuilder("toString")
    .addAnnotation(Override.class)

使用AnnotationSpec.builder()给注解设置属性:

MethodSpec logRecord = MethodSpec.methodBuilder("recordEvent")
    .addModifiers(Modifier.PUBLIC, Modifier.ABSTRACT)
    .addAnnotation(AnnotationSpec.builder(Headers.class)
        .addMember("accept", "$S", "application/json; charset=utf-8")
        .addMember("userAgent", "$S", "Square Cash")
        .build())
    .addParameter(LogRecord.class, "logRecord")
    .returns(LogReceipt.class)
    .build();

8)文档

属性,方法和类型能使用Javadoc文档化:

分类: 注解

0 条评论

发表回复

您的电子邮箱地址不会被公开。