转载自:http://mp.weixin.qq.com/s/bJo52xfQO_sQLQP6I-Pxyw

 在上一篇文章([Android JavaPoet 动态生成Java源码(1)])中,已经介绍了JavaPoet的部分语法及使用;本篇文章,继续接着上一篇文章进一步进行分析及翻译。

1
 语法栗子

   

方法

       上述所有方法(上一篇)都有一个代码体。使用Modifiers.ABSTRACT可以获取到一个方法,但是无方法体。封闭类要么是抽象类,要么是接口,这是唯一合法的语法定义。

生成以下的代码:

    其他的Modifiers在这里也是允许的。注意,当使用指定的Modifiers,JavaPoet使用javax.lang.model.element.Modifier,在Android中是不提供这个类的。这个将限制代码的生成,生成的代码运行在每个地方:JVMs, Android, and GWT。

构造函数

MethodSpec 是一个轻微的错误称呼;它也可以用于构造方法;

生成以下代码:

对于大多数部分,构造函数就像方法一样工作。当生成代码的时候,JavaPoet会把构造方法放到其他方法的最前方。

参数

    声明参数在方法和构造方法中,ParameterSpec.builder()或MethodSpec's都没有addParameter() Api使用方便:

虽然上面的代码生成的Android代码和参数是不同的,但是输出都是一样的。

当参数使用注解(比如: @Nullable)的方式时,扩展Builder是必要的方法。

属性(字段)

    类似的参数,可以创建字段或builders在方法上使用很方便:

生成如下代码:

    当属性有注释,注解或初始化值时,扩展Builder是必要的。属性初始化和String.format(),像上面的代码块一样的语法。

如下:

接口

    JavaPoet定义接口没有问题,不麻烦。注意,接口的方法必须一定是PUBLIC ABSTRACT和接口字段必须始终是公共静态的最后一个。当定义接口时,修饰词是必需的。

但是,当生成代码时,这些修饰词被忽略了。这些是默认的,我们不需要包含文档。

枚举

    使用enumBuilder创建一个枚举类型,使用addEnumConstant()添加枚举值

生成如下代码:

支持枚举,在枚举值或调用超类构造函数的重载方法。这里有一个综合的例子

生成如下代码:

匿名内部类

    在枚举代码中,我们使用Types.anonymousInnerClass()。匿名内部类也可以在代码块中,它们可以是引用值$L

此生成一个包含一个包含方法的类的方法

定义匿名内部类的一个特别棘手的部分是父类的构造函数的参数。在上面的代码中我们没有参数传递空字符串:TypeSpec anonymousclassbuilder('')。通过使用不同的参数javapoet的代码语法,用逗号来分隔参数。

注解

一个简单的关于注解的栗子:

生成的方法是@Override 注解:

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

生成的注解有accept和userAgent属性:

当你有一个猜想时,注解值可以释放本身,用于嵌套的注释:

生成如下代码:

注意,你可以调用addmember()多次相同的属性名来填充一个列表的属性值。

Java文档/注释

字段、方法和类型可以用javadoc文档:

生成如下代码:

当使用引用类型时$T,将会自动导入引用 类型。


小弟,能力有限,文章如有问题或疑问,请通过以下公众号 把问题发送给我,我会第一时间给你回复,谢谢!



本文转载:CSDN博客