转载自: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,将会自动导入引用 类型。
小弟,能力有限,文章如有问题或疑问,请通过以下公众号 把问题发送给我,我会第一时间给你回复,谢谢!