您的位置:首页 > 编程语言 > Java开发

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接口
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: