让我来详细讲解一下 Java 代码生成器的制作流程。
1. 确定生成器的目标和功能
Java 代码生成器的目标是为开发者提供快速便捷的自动化代码生成服务。开发者可以通过输入指定参数,自动生成与业务相关的代码,提高开发效率。
具体的功能可以根据业务需求制定,以下是一些常用的功能:
- 自动生成 POJO 类
- 自动生成 DAO 层代码
- 自动生成 Service 和 Controller 代码
- 自动生成 Swagger 文档
- 自动生成北京时间(JAVA),基于时间戳,DateFormatUtils 类的 date 格式
- 自动生成日报模板(举例)
2. 确定技术选型
根据项目实际需求,可以选择不同的技术栈来实现代码生成器。以下是一些常用的技术选型:
- 代码模板引擎:Freemarker、Velocity、Thymeleaf
- 输入模式:Web、CLI
- 代码库管理工具:Git
- 单元测试工具:JUnit 4、5
- 编译工具:Maven、Gradle
3. 编写代码模板
代码生成器的核心是代码模板。代码模板根据输入参数,生成对应的 Java 代码文件。在编写代码模板时,可以使用任意一种代码模板引擎,以下以 Freemarker 为例。
示例 1:生成指定字段的 POJO 类
以下代码生成器的目标是生成指定字段的 POJO 类。输入参数包括类名、字段名和字段类型。
public class ${className} {
<#list fields as field>
private ${field.type} ${field.name};
</#list>
<#list fields as field>
public ${field.type} get${field.name?cap_first}() {
return ${field.name};
}
<#if field.type == "boolean">
public boolean is${field.name?cap_first}() {
return ${field.name};
}
</#if>
public void set${field.name?cap_first}(${field.type} ${field.name}) {
this.${field.name} = ${field.name};
}
</#list>
}
示例 2:生成指定 SQL 语句的 DAO 层代码
以下代码生成器的目标是生成指定 SQL 语句的 DAO 层代码。输入参数包括 SQL 语句和参数列表。
public interface ${className}Dao {
<#if isUpdate>
/**
* 更新记录
*/
int update(${#lists.size(args) > 0 ? args[0].type?cap_first : ''} ${#lists.size(args) > 0 ? args[0].name : ''});
</#if>
<#if isSelect>
/**
* 查询记录
*/
${className} select(${#lists.size(args) > 0 ? args[0].type?cap_first : ''} ${#lists.size(args) > 0 ? args[0].name : ''});
</#if>
}
4. 编写代码生成器
根据需求和代码模板,编写代码生成器。代码生成器根据输入参数,调用模板引擎,生成对应的 Java 代码文件。
示例 3:从命令行输入参数自动生成指定字段的 POJO 类
public static void main(String[] args) throws Exception {
Options options = new Options();
Option classNameOption = new Option("cn", "className", true, "class name");
classNameOption.setRequired(true);
options.addOption(classNameOption);
Option fieldOption = new Option("f", "fields", true, "fields");
fieldOption.setRequired(true);
options.addOption(fieldOption);
CommandLineParser parser = new DefaultParser();
HelpFormatter formatter = new HelpFormatter();
CommandLine cmd;
try {
cmd = parser.parse(options, args);
} catch (ParseException e) {
System.out.println(e.getMessage());
formatter.printHelp("utility-name", options);
System.exit(1);
return;
}
String className = cmd.getOptionValue("className");
String fields = cmd.getOptionValue("fields");
List<Field> fieldList = new ArrayList<>();
String[] fieldArray = fields.split(",");
for (String fieldString : fieldArray) {
String[] fieldInfo = fieldString.split(":");
fieldList.add(new Field(fieldInfo[0], fieldInfo[1]));
}
Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);
cfg.setClassForTemplateLoading(Generator.class, "/templates");
cfg.setDefaultEncoding("UTF-8");
Template template = cfg.getTemplate("pojo.ftl");
Map<String, Object> data = new HashMap<>();
data.put("className", className);
data.put("fields", fieldList);
Writer out = new OutputStreamWriter(System.out);
template.process(data, out);
}
示例 4:从命令行输入参数自动生成指定 SQL 语句的 DAO 层代码
public static void main(String[] args) throws Exception {
Options options = new Options();
Option classNameOption = new Option("cn", "className", true, "class name");
classNameOption.setRequired(true);
options.addOption(classNameOption);
Option sqlOption = new Option("s", "sql", true, "sql statement");
sqlOption.setRequired(true);
options.addOption(sqlOption);
Option isUpdateOption = new Option("u", "isUpdate", false, "is update");
options.addOption(isUpdateOption);
Option isSelectOption = new Option("q", "isSelect", false, "is select");
options.addOption(isSelectOption);
OptionGroup argsOptionGroup = new OptionGroup();
Option argsOption = new Option("a", "args", true, "args");
argsOptionGroup.addOption(argsOption);
options.addOptionGroup(argsOptionGroup);
CommandLineParser parser = new DefaultParser();
HelpFormatter formatter = new HelpFormatter();
CommandLine cmd;
try {
cmd = parser.parse(options, args);
} catch (ParseException e) {
System.out.println(e.getMessage());
formatter.printHelp("utility-name", options);
System.exit(1);
return;
}
String className = cmd.getOptionValue("className");
String sql = cmd.getOptionValue("sql");
boolean isUpdate = cmd.hasOption("isUpdate");
boolean isSelect = cmd.hasOption("isSelect");
Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);
cfg.setClassForTemplateLoading(Generator.class, "/templates");
cfg.setDefaultEncoding("UTF-8");
Template template = cfg.getTemplate("dao.ftl");
Map<String, Object> data = new HashMap<>();
data.put("className", className);
data.put("sql", sql);
data.put("isUpdate", isUpdate);
data.put("isSelect", isSelect);
if (cmd.hasOption("args")) {
List<Field> argList = new ArrayList<>();
String[] argArray = cmd.getOptionValue("args").split(",");
for (String argString : argArray) {
String[] argInfo = argString.split(":");
argList.add(new Field(argInfo[0], argInfo[1]));
}
data.put("args", argList);
}
Writer out = new OutputStreamWriter(System.out);
template.process(data, out);
}
以上就是 Java 代码生成器的制作流程。可以根据实际需求和业务场景,选择不同的技术选型和代码模板。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java代码生成器的制作流程详解 - Python技术站