Java注解全解析(附)——javapoet简介
2016-12-20 17:58
573 查看
概述
很多框架,包括butterknife都是通过javapoet来生成代码。引入:
在build.gradle中添加依赖:
compile 'com.squareup:javapoet:1.7.0'
javapoet里面常用的几个类:
MethodSpec:代表一个方法。
TypeSpec:代表一个类、接口或枚举。
FieldSpec:代表一个成员变量。
JavaFile:代表一个包含顶级类的Java文件。
一个简单的例子:
private void generateHelloworld() throws IOException{ //创建方法 //方法的写法1 MethodSpec main = MethodSpec.methodBuilder("main") //main是方法名 .addModifiers(Modifier.PUBLIC,Modifier.STATIC)//方法名前的修饰关键字 .addParameter(String[].class, "args") //方法参数 .addStatement("$T.out.println($S)", System.class,"Hello World")//$T和$S都是占位符 .build(); //创建类 TypeSpec typeSpec = TypeSpec.classBuilder("HelloWorld")//HelloWorld是类名 .addModifiers(Modifier.FINAL,Modifier.PUBLIC) .addMethod(main) //在类中添加方法 .build(); //创建java文件 JavaFile javaFile = JavaFile.builder("com.example.helloworld", typeSpec)//两个参数分别是包名和java类 .build(); javaFile.writeTo(System.out); }
生成的java文件内容如下:
package com.example.helloworld; import java.lang.String; import java.lang.System; public final class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } }
其他
方法的写法2://要实现的效果 void main() { int total = 0; for (int i = 0; i < 10; i++) { total += i; } } //写法 MethodSpec main = MethodSpec.methodBuilder("main") .addCode("" + "int total = 0;\n" + "for (int i = 0; i < 10; i++) {\n" + " total += i;\n" + "}\n") .build();
这种写法与上面的写法1相比,不会自动import用到的类。而如果使用写法1,在处理String[].class和System.class时,会自动import String类和System类。
方法的写法3:
//实现与上面一样的效果 MethodSpec main = MethodSpec.methodBuilder("main") .addStatement("int total = 0") .beginControlFlow("for (int i = 0; i < 10; i++)") .addStatement("total += i") .endControlFlow() .build();
使用这种
beginControlFlow-endControlFlow结构来写if、for、while语句块很方便。
占位符:
$L for Literals
字面值。Literals直接写在输出代码中,没有转义。
$S for Strings
$T for Types
$N for Names
我们自己的方法名或者变量名等等
.beginControlFlow("for (int i = " + from + "; i < " + to + "; i++)") .addStatement("result = result " + op + " i") //上面的语句可以用占位符来写: .beginControlFlow("for (int i = $L; i < $L; i++)", from, to) .addStatement("result = result $L i", op)
import:
JavaFile.builder("com.example.helloworld", hello) .addStaticImport(hoverboard, "createNimbus") .addStaticImport(namedBoards, "*") .addStaticImport(Collections.class, "*") .build(); //效果 import static com.mattel.Hoverboard.Boards.*; import static com.mattel.Hoverboard.createNimbus; import static java.util.Collections.*;
成员变量(Field):
//效果 public class HelloWorld { private final String android = "Lollipop v." + 5.0; private final String robot; } //实现 FieldSpec android = FieldSpec.builder(String.class, "android")//参数:字段类型,字段名 .addModifiers(Modifier.PRIVATE, Modifier.FINAL) .initializer("$S + $L", "Lollipop v.", 5.0d)//初始化 .build(); TypeSpec helloWorld = TypeSpec.classBuilder("HelloWorld") .addModifiers(Modifier.PUBLIC) .addField(android) .addField(String.class, "robot", Modifier.PRIVATE, Modifier.FINAL) .build();
javapoet的其他方法:
MethodSpec.addJavadoc(“XXX”) 方法上面添加注释
MethodSpec.constructorBuilder() 构造器
MethodSpec.addAnnotation(Override.class); 方法上面添加注解
TypeSpec.enumBuilder(“XXX”) 生成一个XXX的枚举
TypeSpec.interfaceBuilder(“HelloWorld”)生成一个HelloWorld接口
相关文章推荐
- ajax返回servlet的值
- 选择排序-Java版
- Java注解全解析(三)——编译时注解示例
- Java解析json数据
- 冒泡排序-java版
- Spring+SpringMVC+Mybatis博客源码分享
- Java注解全解析(二)——运行时注解示例
- Java开发要学习的知识总结
- JVM学习笔记
- IntelliJ IDEA自动加载修改的文件内容
- Spring MVC快速入门
- spring2.5各jar包的作用
- java动态代理与Cglib库
- Java注解全解析(一)——注解简介
- 《JAVA与模式》之简单工厂模式
- spring boot +spring stateMachine启蒙程序
- eclipse中jetty启动超时了办
- eclipse svn 文件冲突问题
- Shiro和Spring结合对请求路径进行过滤和记住我过滤操作
- struts2标签ifelse判断条件的使用