用java代码实现 copy大法 根据已有的类 替换关键字 生成新的类
程序员文章站
2022-03-08 17:25:12
...
场景: 在使用copy大法时, 根据已经存在类, 需要手动的复制类, 修改名称, 替换类中的关键字 比如: User表已存在, 要新加一个表 UserOperator 用户操作表, 那么可以把 service serviceImpl dao daoImpl Mapper 等类中的东西都很简单
都是复制,替换的活, 用代码来实现是最省事了
import com.google.common.base.CaseFormat;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 基于已经存在的类 生成新类
*
* <p>
* 文件处理 https://blog.csdn.net/qq_34912208/article/details/113141486
*/
public class GeneraterJavaFile {
// 模板文件列表
static List<String> templateList = new ArrayList<>();
// 替换字段集合
static Map<String, String> replaceMap = new HashMap<>();
static {
templateList.add("com.xxx.xxx.entity.UserInfo");
templateList.add("com.xxx.xxx.dao.impl.UserDaoImpl");
templateList.add("com.xxx.xxx.dao.mapper.UserMapper");
templateList.add("com.xxx.xxx.service.UserStrategy");
String targetKeyWord = "UserOperator";
replaceMap.put("UserInfo", targetKeyWord);//大驼峰
// replaceMap.put("userInfo", "userAddress");// 小驼峰
// replaceMap.put("_user_info", "_user_address");// 下划线
replaceMap.put("bankInfo", CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_CAMEL, targetKeyWord));// 小驼峰
replaceMap.put("_bank_info", "_" + CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, targetKeyWord));// 下划线
replaceMap.put("用户信息表", "用户操作"+"表");
}
public static void main(String[] args) throws Exception {
GeneraterJavaFile generater = new GeneraterJavaFile();
for (String fullClassName : templateList) {
// 生成文件
generater.generater(fullClassName);
// 删除已生成的文件, 编译有报错时需要手动删
// generater.delete(fullClassName);
}
}
/**
* 删除新生成的文件
*/
private void delete(String fullClassName) throws IOException {
Class<?> delClass = null;
try {
delClass = Class.forName(fullClassName);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
String path = getPathByClassFullName(delClass);
FileUtils.deleteQuietly(new File(path + replaceByMap(delClass.getSimpleName()) + ".java"));
}
public void generater(String fullClassName) throws IOException {
Class<?> aClass = null;
try {
aClass = Class.forName(fullClassName);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
String path = getPathByClassFullName(aClass);
String content = FileUtils.readFileToString(new File(path + aClass.getSimpleName() + ".java"), Charset.defaultCharset());
// System.out.println("替换前: \r\n " + content);
String replaceContent = replaceByMap(content);
// System.out.println("替换后: \r\n " + replaceContent);
generateFile(replaceContent, path, replaceByMap(aClass.getSimpleName() + ".java"));
}
/**
* 通用替换
*/
String replaceByMap(String str) {
for (Map.Entry<String, String> entry : replaceMap.entrySet()) {
str = str.replaceAll(entry.getKey(), entry.getValue());
}
return str;
}
/**
* 根据类完整路径, 获取xxx.java文件所在路径
*/
String getPathByClassFullName(Class<?> aClass) {
if (aClass == null) {
throw new RuntimeException("类不能为空");
}
URL resource = aClass.getResource("");
String path = resource.getPath();
path = path.replace("/target/classes", "/src/main/java");
System.out.println(aClass.getSimpleName() + ".java文件存放路径: " + path);
return path;
}
private static void generateFile(String fullClassContent, String path, String fileName) {
// 默认生成的路径为 当前运行类的位置
try {
System.out.println("文件生成路径: " + path);
if (!new File(path).exists()) {
new File(path).mkdirs();
}
File file = new File(path + File.separator + fileName);
if (file.isFile() && file.exists()) {
System.out.println("文件已存在...删除文件");
file.delete();
}
FileUtils.write(file, fullClassContent, Charset.defaultCharset().displayName());
} catch (IOException e) {
System.out.println("文件生成失败!");
e.printStackTrace();
}
}
}