JavaPoet 的使用

29 篇文章 0 订阅
28 篇文章 0 订阅

JavaPoet 用来生成 .java 文件,本文介绍它的用法。
JavaPoet 官方文档:https://github.com/square/javapoet

一、引用

implementation ‘com.squareup:javapoet:1.11.1’

直接在 Android Studio 新建项目的 build.gradle 引入,使用时找不到 javax.lang.model.element.Modifier 类,因为 android sdk (基于 OpenJDK)里没有 javax.lang.model 包。

所以要在 java library 中引入并使用。

二、HelloWorld

生成这样第一个 java 文件:

package com.example.helloworld;

public final class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, JavaPoet!");
    }
}

生成代码:

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.gdeer.lib", helloWorld)
    .build();

javaFile.writeTo(System.out);

三、控制流

即 if、else、for。

要生成这样的代码:

int calculate() {
    int total = 0;
    for (int i = 0; i < 10; i++) {
        total += i;
    }
    return total;
}

可以这样:

MethodSpec calculate = MethodSpec.methodBuilder("calculate")
    .returns(int.class)
    .addCode(""
        + "int total = 0;\n"
        + "for (int i = 0; i < 10; i++) {\n"
        + "  total += i;\n"
        + "}\n"
        + "return total;\n")
    .build();

也可以这样:

MethodSpec calculate1 = MethodSpec.methodBuilder("calculate1")
    .returns(int.class)
    .addStatement("int total = 0")
    .beginControlFlow("for (int i = 0; i < 10; i++)")
    .addStatement("total += i")
    .endControlFlow()
    .build();

addStatement 会给语句后加上;\n
beginControlFlow 会给语句加上{\n
endControlFlow 会添加一行}\n

四、通配符

4.1 $L、$S(字面值、字符串)

$L 相当于 String.format 中 %s 一样,将指定的字符串替换到 $L的地方。
$S 相当于给 $L 加上一对引号。

addStatement("$T.out.println($L)", System.class, 234)
addStatement("$T.out.println($S)", System.class, 234)

生成的内容为:

System.out.println(234);
System.out.println("234");

4.3 $T (类、接口、枚举)

在 JavaPoet 代指的是TypeName,该模板主要将 Class 抽象出来,用传入的 TypeName 指向的 Class 来代替。

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

生成的内容为:

Bundle bundle = new Bundle();

4.4 $N(方法名、变量名)

$N 代指一个名称,例如调用的方法名称,变量名称。
当 $N 的字面值和其代表的值一致时,相当于 $L。

MethodSpec printAInternal = MethodSpec.methodBuilder("printAInternal")
    .addStatement("$T.out.println('a')", System.class)
    .build();

MethodSpec printA = MethodSpec.methodBuilder("byteToHex")
    .addStatement("$N()", printAInternal)
    .build();

生成的内容为:

void printAInternal() {
    System.out.println('a');
}
void byteToHex() {
    printAInternal();
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值