文章目录
在一个阳光明媚的下午,接到一个需求,大家都觉得自己去定义全局变量比较麻烦,后期维护也比较麻烦,所以能不能自动生成一下
思路:选择一个想操作的表单或者页面,然后可选择所选择表单的字段及表名,制作两个按钮,一个按钮是去自动生成一个文本,在页面展示可复制,另一个按钮是生成一个java文件,这样对于开发者不管是直接使用java文件还是拷贝这个文本都比较方便,详细可看下方代码
生成文本可拷贝
java
public class ConstantClassGenerator {
private void createJavaTxt(Map<String, String> logNameMap, String tableName) {
StringBuilder result = new StringBuilder("package " + PACKADDRES + ";\n\npublic class " + getTableName(tableName) + "Constants {\n");
logNameMap.forEach((columnName, fieldName) -> {
result.append(" /**\n * ").append(fieldName).append("\n */\n")
.append(" public static final String ").append(toConstantName(columnName)).append(" = \"").append(columnName).append("\";\n");
});
result.append("}\n");
CodeEdit codeEdit = this.getView().getControl("hifi_codeeditap");
codeEdit.setText(result.toString());
}
@NotNull
private String getTableName(String tableName) {
int index = tableName.indexOf("hifi_");
return toConstantName(index != -1 ? tableName.substring(index + "hifi_".length()) : tableName);
}
private static String toConstantName(String columnName) {
StringBuilder result = new StringBuilder();
Arrays.stream(columnName.split("_")).filter(word -> !word.isEmpty()).forEach(word -> {
result.append(Character.toUpperCase(word.charAt(0)))
.append(word.substring(1).toLowerCase());
});
return result.toString();
}
}
效果如图:
生成java文件到桌面
java
public class ConstantClassGenerator{
public static final String PACKADDRES = "com.xxx.xxxx.xxx";
private void createJavaClass(Map<String, String> maps, String tableName) {
String tableNameNew = getTableName(tableName);
String fileName = tableNameNew + "Constants.java";
String fullPath = System.getProperty("user.home") + "/Desktop/" + fileName;
try (FileWriter writer = new FileWriter(fullPath)) {
writer.write("public class " + tableNameNew + "Constants {\n");
maps.forEach((columnName, fieldName) -> {
try {
writer.write(" /**\n * " + fieldName + "\n */\n");
writer.write(" public static final String " + toConstantName(columnName) + " = \"" + columnName + "\";\n");
} catch (IOException e) {
e.printStackTrace();
}
});
writer.write("}\n");
} catch (IOException e) {
e.printStackTrace();
}
}
private static String toConstantName(String columnName) {
StringBuilder result = new StringBuilder();
Arrays.stream(columnName.split("_")).filter(word -> !word.isEmpty()).forEach(word -> {
result.append(Character.toUpperCase(word.charAt(0)))
.append(word.substring(1).toLowerCase());
});
return result.toString();
}
}
效果如图:
应用场景
-
快速原型开发
- 描述:在项目初期,开发者可以使用代码生成工具快速创建原型,以便于测试概念和功能。
- 工具:如 Spring Initializr、JHipster 等,可以快速生成基本的项目结构和样板代码。
-
代码重复性任务
- 描述:对于常见的 CRUD 操作,自动生成代码可以减少手动编码的时间和错误。
- 工具:如 MyBatis Generator、Hibernate Tools 等,可以自动生成实体类、数据访问层和映射文件。
-
微服务架构
- 描述:在微服务架构中,通常需要多个服务间的标准化接口,自动生成 API 文档和代码可以提高效率。
- 工具:OpenAPI Generator 可以从 OpenAPI 规范生成服务接口代码。
-
代码模板
- 描述:使用代码生成器生成符合特定规范的代码模板,确保团队成员的一致性。
- 工具:如 Apache Velocity、Freemarker 等,可以根据预定义模板生成代码。
-
框架集成
- 描述:集成各种框架(如 Spring、Hibernate 等)时,自动生成所需配置和基础代码可以加快开发速度。
- 工具:如 Spring Boot 的自动配置功能,可以根据项目需求生成必要的配置文件。
-
数据库表结构变更
- 描述:当数据库表结构发生变化时,自动生成对应的 Java 实体类和数据库迁移代码可以保持一致性。
- 工具:Liquibase 或 Flyway 可以帮助管理数据库迁移,同时生成相应的实体类。
-
单元测试
- 描述:自动生成单元测试代码可以确保代码的可测试性,并提高代码的质量。
- 工具:JUnit 和 Mockito 的集成工具可以根据现有代码自动生成测试代码。
-
文档生成
- 描述:通过自动化工具生成 API 文档或代码注释,提高文档的准确性和时效性。
- 工具:Swagger 和 Javadoc 可以自动生成接口文档和代码注释。
-
领域特定语言 (DSL)
- 描述:为特定领域创建 DSL,并通过代码生成器将 DSL 转换为 Java 代码,从而实现业务逻辑的快速开发。
- 工具:ANTLR、Xtext 等可以用于构建 DSL 解析器和代码生成器。
-
代码迁移与重构
- 描述:在进行系统迁移或重构时,自动生成代码可以帮助重用旧系统的逻辑,减少手动迁移的工作量。
- 工具:如 JDepend、SonarQube 等工具可以帮助分析旧代码并生成重构建议。
按照上述的原理,不管我们想自动生成什么java文件或者一些公共的代码都可以去实现,主要的应用场景还是方便项目管理以及提升开发效率