java类的使用方法小结_JavaPoet的使用指南小结
前言
对于我来说,JavaPoet也是不经意间发现的,日常Android开发中:
主要使用Mvp+RxJava+Dagger2这套框架
在这套框架里每次写 Activity 或者 Fragment 就会写一套Mvp+Compent+Module,如下图:
生成内容.jpeg
经过长时间的重复编写,发现这一套Mvp+Compent+Module文件,只有名称是变化的,所以只需要将名称抽象出来,其他只需模板化,就能生成出上述Java文件.
正当想怎么能够快捷生成Java文件,这时JavaPoet便出现,而且JavaPoet能够完全满足需求。
本文主要以JavaPoet的使用方法介绍为主,会将JavaPoet的基本API都介绍一遍,你也可以理解成JavaPoet的中文简易教程
JavaPoet的基本介绍
(1)JavaPoet是一款可以自动生成Java文件的第三方依赖
(2)简洁易懂的API,上手快
(3)让繁杂、重复的Java文件,自动化生成,提高工作效率,简化流程
JavaPoet的小试牛刀
为了展示JavaPoet的能力,这里以自动生成一个全新的MainActivity为例。
public class MainActivity extends Activity{
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
我在使用JavaPoet的时候,习惯从外向内逐一生成,但是这不是标准,这里可以按照自己的方式来理解和生成.
public static void main(String[] args) {
ClassName activity = ClassName.get("android.app", "Activity");
TypeSpec.Builder mainActivityBuilder = TypeSpec.classBuilder("MainActivity")
.addModifiers(Modifier.PUBLIC)
.superclass(activity);
ClassName override = ClassName.get("java.lang", "Override");
ClassName bundle = ClassName.get("android.os", "Bundle");
ClassName nullable = ClassName.get("android.support.annotation", "Nullable");
ParameterSpec savedInstanceState = ParameterSpec.builder(bundle, "savedInstanceState")
.addAnnotation(nullable)
.build();
MethodSpec onCreate = MethodSpec.methodBuilder("onCreate")
.addAnnotation(override)
.addModifiers(Modifier.PROTECTED)
.addParameter(savedInstanceState)
.addStatement("super.onCreate(savedInstanceState)")
.addStatement("setContentView(R.layout.activity_main)")
.build();
TypeSpec mainActivity = mainActivityBuilder.addMethod(onCreate)
.build();
JavaFile file = JavaFile.builder("com.test", mainActivity).build();
try {
file.writeTo(System.out);
} catch (IOException e) {
e.printStackTrace();
}
}
通过在Main方法中运行以上的代码,就可以直接生成出MainActivity对象,自上而下的观察上述代码,你会发现JavaPoet让java文件变得有逻辑性。
JavaPoet的常用类
TypeSpec————用于生成类、接口、枚举对象的类
MethodSpec————用于生成方法对象的类
ParameterSpec————用于生成参数对象的类
AnnotationSpec————用于生成注解对象的类
FieldSpec————用于配置生成成员变量的类
ClassName————通过包名和类名生成的对象,在JavaPoet中相当于为其指定Class
ParameterizedTypeName————通过MainClass和IncludeClass生成包含泛型的Class
JavaFile————控制生成的Java文件的输出的类
JavaPoet的常用方法
设置修饰关键字
addModifiers(Modifier... modifiers)
Modifier是一个枚举对象,枚举值为修饰关键字Public、Protected、Private、Static、Final等等。
所有在JavaPoet创建的对象都必须设置修饰符(包括方法、类、接口、枚举、参数、变量)。
设置注解对象
addAnnotation(AnnotationSpec annotationSpec)
addAnnotation(ClassName annotation)
addAnnotation(Class> annotation)
该方法即为类或方法或参数设置注解,参数即可以是AnnotationSpec,也可以是ClassName,还可以直接传递Class对象。
一般情况下,包含复杂属性的注解一般用AnnotationSpec,如果单纯添加基本注解,无其他附加属性可以直接使用ClassName或者Class即可。
设置注释
addJavadoc(CodeBlock block)
addJavadoc(String format, Object... args)
在编写类、方法、成员变量时,可以通过addJavadoc来设置注释,可以直接传入String对象,或者传入CodeBlock(代码块)。
JavaPoet生成类、接口、枚举对象
在JavaPoet中生成类、接口、枚举,必须得通过TypeSpec生成,而classBuilder、interfaceBuilder、enumBuilder便是创建其关键的方法:
创建类:
TypeSpec.classBuilder("类名“)
TypeSpec.classBuilder(ClassName className)
创建接口:
TypeSpec.interfaceBuilder("接口名称")
TypeSpec.interfaceBuilder(ClassName className)
创建枚举:
TypeSpec.enumBuilder("枚举名称")
TypeSpec.enumBuilder(ClassName className)
继承、实现接口
继承类:
.superclass(ClassName className)
实现接口
.addSuperinterface(ClassName className)
继承存在泛型的父类
当继承父类存在泛型时,需要使用ParameterizedTypeName
ParameterizedTypeName get(ClassName rawType, TypeName... typeArguments)
返回的ParameterizedTypeName对象,已经被添加泛型信息
方法
addMethod(MethodSpec methodSpec)
通过配置MethodSpec对象,使用addMethod方法将其添加进TypeSpec中。
枚举
addEnumConstan(String enumValue)
通过addEnumConstan方法添加枚举值,参数为枚举值名称。
JavaPoet生成成员变量
JavaPoet生成成员变量是通过FieldSpec的build方法生成.
builder(TypeName type, String name, Modifier... modifiers)
只要传入TypeName(Class)、name(名称)、Modifier(修饰符),就可以生成一个基本的成员变量。
成员变量一般来说由注解(Annotation)、修饰符(Modifier)、Javadoc(注释)、initializer(实例化)。
注解
addAnnotation(TypeName name)
修饰符
addModifiers(Modifier ...modifier)
注释
addJavadoc(String format, Object... args)
由于上述三个方法,都在通用方法介绍过这里就不再重复介绍。
实例化
initializer(String format, Object... args)
即成员变量的实例化,例:
public Activity mActivity = new Activity;
而 initializer方法中的内容就是“=”后面的内容 ,下面看下具体的代码实现,上面的成员变量:
ClassName activity = ClassName.get("android.app", "Activity");
FieldSpec spec = FieldSpec.builder(activity, "mActivity")
.addModifiers(Modifier.PUBLIC)
.initializer("new $T", activity)
.build();
JavaPoet生成方法
JavaPoet生成方法分为两种,第一种是构造方法,另一种为常规的方法。
构造方法
MethodSpec.constructorBuilder()
常规方法
MethodSpec.methodBuilder(String name)
方法的主要构成有方法参数、注解、返回值、方法体、抛出异常五种,注解可以参考通用方法addAnnotation,其他方法我们将会一一介绍:
方法参数
addParameter(ParameterSpec parameterSpec)
设置方法参数的方法通过addParameterSpec来实现,ParameterSpec的具体使用参考下一小节。
返回值
returns(TypeName returnType)
设置方法的返回值,只需传入一个TypeName对象,而TypeName是ClassName,ParameterizedTypeName的基类。
方法体
在JavaPoet中,设置方法体内容有两个方法,分别是addCode和addStatement:
addCode()
addStatement()
这两个本质上都是设置方法体内容,但是不同的是使用addStatement()方法时,你只需要专注于该段代码的内容,至于结尾的分号和换行它都会帮你做好。
而addCode()添加的方法体内容就是一段无格式的代码片,需要开发者自己添加其格式。
方法体模板
在JavaPoet中,设置方法体使用模板是比较常见的,因为addCode和addStatement方法都存在这样的一个重载:
addCode(String format, Object... args)
addStatement(String format, Object... args)
在JavaPoet中,format中存在三种特定的占位符:
$T
$T 在JavaPoet代指的是TypeName,该模板主要将Class抽象出来,用传入的TypeName指向的Class来代替。
ClassName bundle = ClassName.get("android.os", "Bundle");
addStatement("$T bundle = new $T()",bundle)
上述添加的代码内容为:
Bundle bundle = new Bundle();
$N
$N在JavaPoet中代指的是一个名称,例如调用的方法名称,变量名称,这一类存在意思的名称
addStatement("data.$N()",toString)
上述代码添加的内容:
data.toString();
$S
$S在JavaPoet中就和String.format中%s一样,字符串的模板,将指定的字符串替换到$S的地方
.addStatement("super.$S(savedInstanceState)","onCreate")
即将"onCreate"字符串代替到$S的位置上.
抛出异常
.addException(TypeName name)
设置方法抛出异常,可以使用addException方法,传入指定的异常的ClassName,即可为该方法设置其抛出该异常.
JavaPoet生成方法参数
JavaPoet生成有参方法时,需要填充参数,而生成参数则需要通过ParameterSpec这个类。
addParameter(ParameterSpec parameterSpec)
初始化ParameterSpec
ParameterSpec.builder(TypeName type, String name, Modifier... modifiers)
给参数设置其Class,以及参数名称,和修饰符.
通常来说参数的构成包括:参数的类型(Class)、参数的名称(name)、修饰符(modifiers)、注解(Annotation)
除了builder方法初始化类型、以及名称、修饰符之外,其余可以通过如下方法进行设置:
添加修饰符
.addModifiers(Modifier modifier)
添加注解
addAnnotation(TypeName name)
添加修饰符、注解具体使用可参考通用方法。
JavaPoet生成注解
在JavaPoet创建类、成员变量、方法参数、方法,都会用到注解。
如果使用不包含属性的注解可以直接通过
.addAnnotation(TypeName name)
直接传入TypeName或者Class进行设置。
如果使用的注解包含属性,并且不止一个时,这时候就需要生成AnnotationSpec来解决,下面简单了解下AnnotationSpec。
初始化AnnotationSpec
AnnotationSpec.builder(ClassName type)
可以发现初始化,只需传入ClassName或者Class即可。
设置属性
addMember(String name, String format, Object... args)
使用addMember可以设置注解的属性值,name对应的就是属性名称,format的内容即属性体,同样方法体的格式化在这里也是适用的。
JavaPoet如何生成代码
如果上述内容你已经看完,那么恭喜你,你已经明白JavaPoet的意图,但是现在的你,还差最后一步,即如何生成代码。
JavaPoet中负责生成的类是JavaFile
JavaFile.builder(String packageName, TypeSpec typeSpec)
JavaFile通过向build方法传入PackageName(Java文件的包名)、TypeSpec(生成的内容)生成。
打印结果
javaFile.writeTo(System.out)
生成的内容会输出到控制台中
生成文件
javaFile.writeTo(File file)
生成的内容会以java文件的方式,存放到你传入File文件的位置
结束语
当你读完了本文,如果你产生下面的想法:
JavaPoet原来还可以这样
JavaPoet编写过程为什么那么流畅,原来Java文件也可以用编程的方式生成
JavaPoet可不可以改进我的编码流程,提升效率
那么说明你已经对JavaPoet感兴趣了,可以自己动手尝试一下,感受下JavaPoet的魅力。
最后贴一张,JavaPoet秘籍,有了它会很好的帮助你使用JavaPoet.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
java类的使用方法小结_JavaPoet的使用指南小结相关推荐
- java 编写方法和属性,Java类属性及方法的定义
文章导读 [在定义类时,经常需要抽象出它的属性和方法,并定义在类的主体中.本文探讨Java类属性及方法的定义和使用.通过本文的学习,你将了解如何在Java类中定义属性及方法.属性值的设置和获取.] 本 ...
- JSP中调用java类中的方法
JSP中调用java类中的方法 1.新建一个项目,在src文件夹下添加一个包:如:test 2.再在包中添加一个类:如 package test; public class conDatabase { ...
- thymeleaf 调用java,thymeleaf模板引擎调用java类中的方法(附源码)
前言 由于开源了项目的缘故,很多使用了My Blog项目的朋友遇到问题也都会联系我去解决,有的是把问题留在项目的issue里提出,有的是在我的私人博客里留言,还有的则是直接添加我的qq来找我讲自己遇到 ...
- jaxb xsd java_jaxb 这个资料,可以吧后缀为.xsd的文件,转化成java类使用, 方法在 里面有详细的说 Develop 238万源代码下载- www.pudn.com...
文件名称: jaxb下载 收藏√ [ 5 4 3 2 1 ] 开发工具: Java 文件大小: 8775 KB 上传时间: 2013-10-29 下载次数: 2 提 供 者: 郑丽 详细说明 ...
- java 类的方法设计_设计问题:Java类与单方法OK?
我需要以下功能 Given two sorted lists, merge them 我有这个骨架Java代码: public class MergeLists{ public List merge( ...
- idea设置Java类注释和方法注释模板(javadoc规范)
1.类注释模板设置 File–>settings–>Editor–>File and Code Templates–>Files 添加模板: 简版: /** * [一句话描述该 ...
- java类的初始化方法_JAVA类初始化和实例初始化
一.类初始化过程 1.一个类要创建实例需要先创建和加载 (1) main方法所在的类需要先加载和实例化 2.一个子类要初始化,需要先初始化父类 3.一个类初始化就是执行方法 (1) () 方法由静态类 ...
- groovy 访问java,Groovy如何能够访问Java类的私有方法?
Groovy can access private methods and variables of a Java class. How does Groovy do this behind the ...
- c调用java jar_C#调用java类、jar包方法。
一.将已经编译后的java中Class文件进行打包:打包命令JAR 如:将某目录下的所有class文件夹全部进行打包处理: 使用的命令:jar cvf test.jar -C com/ . 其中tes ...
- 安卓studio 不能运行java_Android Studio无法执行Java类的main的解决方法
Android Studio升级到哦最新版3.6.1后,新建了个项目,发现无法执行Java类的main方法.试了网上的各种方法,比如切换gradle离线模式.gradle.properties中添加a ...
最新文章
- 关于字符串 --java
- 记录一些容易忘记的属性 -- UITabBarController
- 一种数据结构的封装模式
- LeetCode刷题——88. 合并两个有序数组
- CSDN账号找回密码的解决方法(原手机号不能使用)
- 光纤通信原理实验箱QY-JXSY03
- Python 刷题笔记:背包问题
- 光盘中的vob格式怎么转换成mp4格式
- 0基础前端开发,html5建站教程
- 拿下春晚,抖音支付要如何在一个月内杀出血路
- DM36X UBL UBoot
- 导数的四则运算法则_高考考纲与考向分析——导数的概念与计算
- pygame开发2048游戏(附源代码)
- 打造智慧城市首选智慧步道
- IntelliJ IDEA 14注册码
- 开关电源电路图及原理详解
- 嵌入式系统概论-5-总线
- 服务器生成js文件,Next.js 静态生成和服务器端渲染
- nand flash 的oob 及坏块管理
- CAKEPHP 约定