2. Java模板引擎 —— JavaPoet的简单使用
1. 絮絮叨叨
在学习注解时,自己就有一个疑问:RUNTIME周期的注解,可以通过反射机制让注解生效。如果是SOURCE或者CLASS呢?
比如,在Spring Boot中经常使用@Value注解,为字段设置默认值、从properties读取value初始化字段、读取bean的某个属性以初始化字段
按照我一个菜鸟的理解,一定有一段注解处理代码,可以将@Value注解中的值赋值给对应字段
可能是在对象创建完成后,通过setter方法进行设置;也可能是直接修改源文件,在定义字段时就进行初始化
@Value("1") private int id; // 改写后的代码,虽然定义时就进行初始化,更加适合final类型的字段 private int id = 1;
在之后的工作和学习中,接触了一些注解,更加坚定了自己要学习下如何实现一个编译时注解处理器的想法
2. 最原始的方法动态生成Java文件
2.1 文件字符流生成Java文件
很显然,想要实现一个编译时注解处理器,很可能需要修改已有的Java类或者新增Java类
例如,实现支持Builder模式的@Builder注解
- 如果将Builder类作为一个单独的类,则需要新增Java类。也就是说,需要新建Java文件
- 如果通过静态方法builder()创建Builder类,则需要修改已有的Java类(lombok的@Builder注解)
最原始的方法,以类似字符串拼接的方式,动态生成Java代码
import java.io.BufferedWriter; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.nio.charset.StandardCharsets;public class GenerateSourceFile {public static void main(String[] args) {// 获取当前类完全限定名并接解析出包名String name = GenerateSourceFile.class.getCanonicalName();int dotIndex = name.lastIndexOf(".");String packageName = null;if (dotIndex > 0) {packageName = name.substring(0, dotIndex);}// 构建文件路径String classPath = GenerateSourceFile.class.getResource("/").getPath();int index = classPath.indexOf("target/classes/");String path = classPath.substring(0, index) + "src/main/java/";String className = "MyJava";if (packageName == null) {path += className;} else {if (packageName.contains(".")) {path = path + packageName.replaceAll(".", "/") + "/" + className + ".java";} else {path = path + packageName + "/" + className + ".java";}}// 通过字符流,创建java源文件try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(path), StandardCharsets.UTF_8))) {if (packageName != null) {writer.write("package " + packageName + ";\n\n");}writer.write("public class " + className + " {\n");writer.write("\tprivate String name;\n");writer.write("\tprivate int age;\n");writer.write("}\n");} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}} }
我的天啊,写了那么多代码,最后生成的Java文件的代码就这么一点点
package entity;public class MyJava {private String name;private int age; }
2.2 令人崩溃的实现方式
- 为了在当前Java文件的包下生成Java文件,我做了好多努力的:一步步试错,不断完善自己的处理逻辑,最终才能在
src/main/java/enity
目录下生成.java文件 - 还有,采用字符串拼接的方式让我崩溃,稍不注意可能就没有换行、对齐、空格啥的
- 因此,有的博客直接就是先在生成一个Java类,粘贴、复制、通过writer输出
- 这样的方法治标不治本:代码难免需要动态生成,不然我还运行时生成干啥?
2. Java模板引擎 —— JavaPoet的简单使用相关推荐
- beetl java例子_初识Java模板引擎Beetl之简单示例
以前没用过模板引擎,没去关注过,今天正好看到,简单看了一下,写个简单的示例,记录一下: 首先,Beetl 是 Bee Template language的缩写,是新一代的模板引擎,它功能强大,拥有主流 ...
- java 模板引擎_极简 Spring Boot 整合 Thymeleaf 页面模板
点击"牧码小子"关注,和众多大牛一起成长! 关注后,后台回复 java ,领取松哥为你精心准备的技术干货! 虽然现在慢慢在流行前后端分离开发,但是据松哥所了解到的,还是有一些公司在 ...
- java 模板引擎_SpringBoot入门系列(四)如何整合Thymeleaf模板引擎
前面介绍了Spring Boot的优点,然后介绍了如何快速创建Spring Boot 项目.不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/ ...
- java 模板引擎_Spring Boot 如何快熟整合Thymeleaf模板引擎
前面介绍了Spring Boot的优点,然后介绍了如何快速创建Spring Boot 项目.不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/ ...
- Beetl学习总结(1)——新一代java模板引擎典范 Beetl入门
1. 什么是Beetl Beetl目前版本是2.7.0,相对于其他java模板引擎,具有功能齐全,语法直观,性能超高,以及编写的模板容易维护等特点.使得开发和维护模板有很好的体验.是新一代的模板引擎. ...
- 新一代的java模板引擎--beetl
模板引擎为了使用户页面和业务数据相互分离而产生,它将从后台返回的数据生成特定格式的文档,用于网站的模板引擎就是生成HTML文档. 模板引擎以简单为主,其主要目的是为了让程序开发和美工设计人员分工明确: ...
- Java 模板引擎总结
Java模板引擎 FreeMarker 概念 介绍 特性 优势 不足 一个小Demo 概念 FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写.它是为Java程 ...
- java 模板引擎 比较_jetbrick-template
概述 Overview jetbrick-template 是一个新一代 Java 模板引擎,具有高性能和高扩展性. 适合于动态 HTML 页面输出或者代码生成,可替代 JSP 页面或者 Veloci ...
- Beetl-新一代Java模板引擎
简介 Beetl是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,超过当前流行的模板引擎.而且还易学易用.官网:http: ...
最新文章
- Delphi真的没落了吗?_说Delphi母语Pascal的另一个应用
- 【CODEVS2776】寻找代表元
- hdu1285 拓扑序
- The most important part of the body
- Intel Idea导入eclipse下的web项目并部署到tomcat
- 跨平台2D/3D游戏开发框架libGDX发布1.2.0更新
- 第一阶段 07类与对象
- 必须知道的ADO.NET 数据库连接池
- eBPF学习记录(三)使用BCC开发eBPF程序
- 计算机和自动化结合的专业,自动化转计算机?你可以选择这个专业!
- OpenCV-标准霍夫变换cv::HoughLines
- 以mysql为例有几种隔离级别_mysql隔离级别有几种
- 航测无人机测绘地理信息免费资料
- 怎么给word文档注音_如何给Word文档中的汉字加拼音?一键加拼音超级方便
- springMVC+mybatis
- python爬虫100例--酷我音乐--周杰伦歌曲(1)
- 小牛叔讲Python第2章:安装配置Python编程环境
- tokenizer.tokenize(), tokenizer.encode() , tokenizer.encode_plus() 方法介绍及其区别
- 使用Notepad++实现文本编辑的豆沙绿背景颜色,护眼
- LibreCAD v2.2.0源码编译,使用VS2019+Qt5.12.9+Boost1.71.0环境
热门文章
- beetl java例子_初识Java模板引擎Beetl之简单示例