Android JavaPoet 动态生成Java源码(1)

转载自:http://mp.weixin.qq.com/s?__biz=MjM5NzA0ODU0NA==&mid=2247483758&idx=1&sn=0a2a36102052c54b7b2127e93c1fc117&scene=23&srcid=07090HfJx4hMRC6ssXYiZbgJ#rd&utm_source=tuicool&utm_medium=referral


1 简介

      官方描述:JavaPoet is a Java API for generating .java source files.(JavaPoet是一个Java Api接口生成.java源码文件的工程)

JavaPoet源码:https://github.com/square/javapoet


    我在此主要承担一个翻译解释的角色,分析给大家;为后一篇文章的发表,奠定一定的基础使用语法。


2  引入库

   compile 'com.squareup:javapoet:1.7.0'


or Maven:


<dependency>

  <groupId>com.squareup</groupId>

  <artifactId>javapoet</artifactId>

  <version>1.7.0</version>

</dependency>


or Eclipse:


https://search.maven.org/remote_content?g=com.squareup&a=javapoet&v=LATEST

3  使用案例

    当做一些事情,如注解处理或元数据处理例如,数据库模式,协议格式)时,源文件生成是有用处的。通过生成的代码,你需要同时保持正确的唯一来源的元数据模板。

例如

看一个简单无趣的栗子:

上方代码的生成就是下方代码使用JavaPoet生成的:

申请这个**main**方法,我们创建一个MethodSpec(修饰符)来配置**main**方法,配置包含:返回值类型,参数列表,代码语句。我们添加**main**放到到**HelloWorld**类中,然后就添加了一个HelloWorld.java文件。

在这个Case中,我们写这个文件到System.out进行输出,但我们可以把它作为字符串或写入到文件系统。


这个文档目录有所有的JavaPoet接口,我们继续向下探究学习。

代码与控制流

很多JavaPoet接口使用了会稳定的Java类。这样构建,方法链式和交互使Api更友好。JavaPoet经常使用的典型案例有类&接口(TypeSpec),属性(FieldSpec),方法&构造方法(MethodSpec),参数(ParameterSpec)和注解(AnnotationSpec).

但是方法和构造方法的主题并没有建模。没有表达式类,没有语句类或语法树节点。相反,javapoet使用字符串的代码块:

生成的代码:

我们人输入分号,换行符和缩进,这些繁琐的的事情使用JavaPoet提供的接口使这些变得更容易。

 这个.addStatement()方法负责分号和换行,beginControlFlow() + endControlFlow()需要一起使用,提供换行符和缩进。

这是一个差劲的栗子,因为塔生成的代码是永恒不变的!假设,我们不想添加0到10,而是希望可以配置操作和范围。根据这些,重新改造的方法如下:

下方就是我们执行上方代码computeRange('multiply10to20', 10, 20, '*')得到以下结果:

方法生成方法!因为JavaPoet生成的是源码不是字节码,你可以阅读它却确保是正确的。

对于文字:$L

连接字符串调用beginControlFlow() 和 addStatement是分散的。太多的操作者。为了解决这个,JavaPoet提供了一个语法灵感,但是不符合语法String.format()。它接受$L在输出中发出一个文字值。这就像是Formatter's %s。

文字直接排放在输出语句中,参数可以是字符串,语句,和一些JavaPoet类型的数据。

对于字符串:$S

当输出的代码中包含字符串时,我们可以使用**$S**发送一个字符串,完成和包裹引用。下面是一个程序,它会发出3种方法,每一种方法都会返回自己的名字:

在这个Case中,$S给添加引号:

对于泛型的类型:$T

我们Java程序喜欢我们自己的类型:它们生成的代码很容易让我们理解。在JavaPoet上,它有丰富的内置支持类型,包含自动生成import声明,使用$T映射到参考类型:

生成一下.java文件,完成必要的import:

我们通过Date.class引用类,正好可以代码生成。这不需要是这样。这里有一个类似的例子,但这一个引用了一个不存在的类:

而不存在的类,导入也是完好的。

这个ClassName类型是非常重要的,当你频繁使用JavaPoet时,你将需要它。它可以识别任何声明类。声明的类型是java的丰富的类型系统的开始:我们也有数组,参数化类型,通配符类型和类型变量。JavaPoet有类构建这些:

JavaPoet将每一种类型分解,并在可能的情况下导入其组件。

Import static

JavaPoet支持导入静态类。它通过显式收集类型成员名称。让我们以一些静态来举栗子:

JavaPoet首先将导入静态块来配置文件,也需要导入其他类型。

对于名称:$N

生成的代码通常是自指的。使用$n引用另一个由它的名称生成的声明。这里的一个方法,调用另一个:

当发生上述代码,我们通过hexdigit()方法作为参数的bytetohex()方法使用$N:

下一篇,接着解析或翻译剩余的部分;


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值