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

文章目录

  • 一、引用
  • 二、HelloWorld
  • 三、控制流
  • 四、通配符
    • 4.1 \$L、$S(字面值、字符串)
    • 4.3 $T (类、接口、枚举)
    • 4.4 $N(方法名、变量名)

一、引用

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

JavaPoet 的使用相关推荐

  1. 【Android 组件化】路由组件 ( 使用 JavaPoet 生成路由表类 )

    文章目录 一.要生成的路由表类 二.生成 路由表 过程 1.获取其它类节点 2.生成参数 3.路由表结构 4.函数创建 5.Java 类创建 6.写出 Java 源码到文件中 三.完整注解处理器及运行 ...

  2. Android Annotation-让你的代码更加优雅(二)做一个Java诗人(JavaPoet)

    上篇回顾 上一篇我们按照思维导图,介绍了注解的基础知识,如何定义一个注解,提示性注解,运行时注解的写法和用法.没有看过第一篇,又对注解知识相对陌生的同学,建议先食用第一篇.本篇将重点介绍编译期注解,自 ...

  3. JavaPoet 开源项目使用

    JavaPoet开源项目使用 JavaPoet项目可以为我们动态的生成Java文件,这是一个很强大和很动态的方法.我们使用注解的时候假如需要生成新的Java文件就可以通过这个开源项目实现. 项目地址: ...

  4. JavaPoet使用详解

    文章目录 简介 常用方法 设置修饰关键字 设置注解 设置字段 设置文档注释 设置分号.换行和缩进 设置方法 TypeSpec 创建类 创建枚举类 创建接口 创建注解 创建匿名内部类 Annotatio ...

  5. javapoet的认识

    这几天接触到了javapoet的知识,总的来说就是在编译时期生成java文件.一开始刚接触到的时候,觉得很黑科技,也确实,这方面的知识,不是很了解,今天就来做点笔记,方便大家学习. 这里是square ...

  6. JavaPoet的使用指南

    JavaPoet的使用指南 前言 JavaPoet的基本介绍 JavaPoet的小试牛刀 JavaPoet的常用类 JavaPoet的常用方法 设置修饰关键字 设置注解对象 设置注释 JavaPoet ...

  7. JavaPoet使用攻略

    JavaPoet是用于生成.java源文件的库 .通过自动生成代码,可以替代许多重复的工作.在安卓项目中添加依赖时,凡是需要添加apt.kpt.annotationProcessor这种前缀标识时,说 ...

  8. 使用Javapoet生成代码

    最近写接口平台,根据xml写对应的类,大量重复代码,粘贴复制,简单学习了javapoet,写了个生成代码的小玩意儿,宗旨是减少重复代码占据你学习的时间 详细文档方法移步官方Github,几乎覆盖所有场 ...

  9. APT和Javapoet的精彩联动

    APT APT,即注解处理器,是一种处理注解的工具.确切来说,它是javac的一个工具,用来在编译时扫描和处理注解.注解处理器以Java代码(或者编译过的字节码)作为输入,以生成.java文件作为输出 ...

  10. Java开源工具库使用之java源代码生成库JavaPoet

    文章目录 前言 一.API 1.1 字段 1.2 方法 1.3 代码块 1.4 类 1.5 java 文件 二.使用例子 2.1 数据库表生成 Bean 2.2 Service测试类生成 参考 前言 ...

最新文章

  1. 为office添加繁简体转换
  2. 中文开源!它或许是最适合自学的Python教材
  3. android中有关invisible,visible,gone的区别
  4. .c/.cpp文件形成.exe文件的过程
  5. 【软件测试工程师】关于软件测试术语的定义,软件测试中的分类
  6. RIPv2 路由手工汇总
  7. VS2010 IDE新特性随笔
  8. ping 计算机名 ipv4,09. 查看本地链路地址(fe80);ping主机名称时IP
  9. 430f149有几种封装类型_高速光调制器的发展与封装技术研究
  10. java json 解析null_解析包含null的原始json数组
  11. java 使用接口便于维护程序_Java初学——面向对象接口的应用
  12. Bootstrap 模态框插件Modal 的方法
  13. iOS开发错误处理技巧,PCH文件的使用,自定义NSNotification消息以及设置监听者(以Core Data处理数据时的错误为例)...
  14. dgvHelper,xmlHelper,inputbox(仿vba),Evaluate(vba中函数应用于C#)
  15. 简单高效!25个漂亮的简约风格网站设计作品
  16. android fd泄露分析,文件描述符(fd)泄漏排查一篇就够了
  17. Effective Java(第三版) 学习笔记 - 第六章 枚举和注解 Rule34~Rule41
  18. 使用JS判断日期的有效性
  19. java实现滑动验证码
  20. 60个平移过渡预设PR合集

热门文章

  1. 医学图像配准实现代码(matlab篇)
  2. 数字化技术在制造业的应用要点—产品开发篇
  3. 采访Java Collection的作者Joshua Bloch
  4. 【平面设计】AI CS 6 软件安装教程
  5. 自学IOS开发第2天·学习基础SwiftUI
  6. 本科计算机专业sci好写吗,保研经验:本科发表4篇SCI,横扫北大、清华、中科大、中科院、浙大17个OFFER!...
  7. 拖动图形验证码(极验验证)
  8. 亚马逊国际站通过ASIN获取商品信息
  9. Linux_cJSON--数据封装与解析
  10. R语言绘图—Veen(韦恩图)