• 自动代码复制工具


    工具用途:

    平时开发程序的时候,如果要在系统里新增一个模块,通常会复制已有的代码文件,然后再做一些修改。如果已有一个User的增删改查模块,此时要新增一个对Student的类似模块,我们就会复制User的Action/Dao/jsp页面等所有java类,然后对里面的内容进行修改。

    对于上面的步骤,当再次新增其他模块时,还会再次重复执行:

    1.逐个复制各个文件

    2.按关键字进行替换(如上面样例中,需要将User替换为Student)

    3.根据业务差异,进行修改

    本工具用于自动完成上面步骤中前两个步骤,达到加快代码开发的目的。

    PS:如果代码模块是基于一种标准的SSH模式来编写的,自然可以采用标准的代码生成工具来生成全套代码,网上也有很多类似的工具,但是纵观各个不同公司的代码,风格各异,很难有一个统一的代码生成工具来生成合适的全套代码,所以这种复制修改的方法反而更适用一些。


    工具代码实现:

    package cn.jerryhouse.util.cc;
    
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.util.LinkedList;
    import java.util.List;
    
    public class CodeCopier {
    	private List<String> srcFileList = new LinkedList<String>();
    	private String srcBaseDir;
    	private String destBaseDir;
    	private List<ReplacePair> replacePairList = new LinkedList<ReplacePair>();
    	private final String NEW_LINE = System.getProperty("line.separator");
    	
    	public void process()
    	{
    		for(String filePath: srcFileList)
    		{
    			String destFilePath = getDestFilePath(filePath);
    			copyAndModifyFile(filePath,destFilePath);
    		}
    	}
    	private String getDestFilePath(String srcFilePath)
    	{
    		File srcFile = new File(srcFilePath);
    		String srcFileName = srcFile.getName();
    		String srcFileDir = srcFile.getParent();
    		String destFileName = getDestFileName(srcFileName);
    		String destFilePath = this.destBaseDir+srcFileDir.substring(srcBaseDir.length())+File.separator+destFileName;
    		return destFilePath;
    	}
    	private String getDestFileName(String srcFilePath)
    	{
    		return updateContentByPattern(srcFilePath);
    	}
    	private void copyAndModifyFile(String srcFilePath,String destFilePath)
    	{
    		try {
    			mkdirsForFilePath(destFilePath);
    			BufferedReader br = new BufferedReader(new FileReader(srcFilePath));
    			BufferedWriter bw = new BufferedWriter(new FileWriter(destFilePath));
    			String line;
    			while((line=br.readLine())!=null)
    			{
    				String updatedLine = updateContentByPattern(line);
    				bw.write(updatedLine+NEW_LINE);
    			}
    			br.close();
    			bw.close();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    	private void mkdirsForFilePath(String filePath)
    	{
    		File file = new File(filePath);
    		file.getParentFile().mkdirs();
    	}
    	private String updateContentByPattern(String content)
    	{
    		for(ReplacePair replacePair: replacePairList)
    		{
    			content = content.replaceAll(replacePair.getToReplacePattern(), replacePair.getReplacement());
    		}
    		return content;
    	}
    	public void addReplacePair(String toReplacePattern,String replacement)
    	{
    		replacePairList.add(new ReplacePair(toReplacePattern,replacement));
    	}
    	public void addSrcFile(String srcFilePath)
    	{
    		srcFileList.add(srcFilePath);
    	}
    	public void setSrcBaseDir(String srcBaseDir) {
    		this.srcBaseDir = srcBaseDir;
    	}
    	public void setDestBaseDir(String destBaseDir) {
    		this.destBaseDir = destBaseDir;
    	}
    }
    


    package cn.jerryhouse.util.cc;
    
    public class ReplacePair {
    	private String toReplacePattern;
    	private String replacement;
    	public ReplacePair(String toReplacePattern,String replacement)
    	{
    		this.toReplacePattern = toReplacePattern;
    		this.replacement = replacement;
    	}
    	public String getToReplacePattern() {
    		return toReplacePattern;
    	}
    	public void setToReplacePattern(String toReplacePattern) {
    		this.toReplacePattern = toReplacePattern;
    	}
    	public String getReplacement() {
    		return replacement;
    	}
    	public void setReplacement(String replacement) {
    		this.replacement = replacement;
    	}
    	
    }
    


    测试代码:

    package cn.jerryhouse.util.cc.test;
    
    import org.junit.Test;
    
    import cn.jerryhouse.util.cc.CodeCopier;
    
    public class CodeCopierTest {
    
    	@Test
    	public void testProcess() {
    		CodeCopier codeCopier = new CodeCopier();
    		codeCopier.setSrcBaseDir("D:/tmp/sshExample2");
    		codeCopier.setDestBaseDir("D:/tmp1/sshExample2");
    		codeCopier.addSrcFile("D:/tmp/sshExample2/src/cn/jerry/ssh/mdv/action/UserAction.java");
    		codeCopier.addSrcFile("D:/tmp/sshExample2/src/cn/jerry/ssh/mdv/dao/UserDaoImp.java");
    		codeCopier.addReplacePair("User", "Student");
    		codeCopier.addReplacePair("user", "student");
    		codeCopier.process();
    	}
    
    }
    


    复制文件和源文件对比:




    转载请注明出处:http://blog.csdn.net/u014569459/article/details/38327339

    
    
  • 相关阅读:
    关于JS系列题材
    《项目整体管理》提纲
    Linux使用java -jar启动会自动停止问题(如何使jar在linux上一直运行)
    linux系统下查看端口被占用情况,并且杀掉进程
    CentOS7.X 下安装MySQL8.0(附文件)
    CentOS7.x 防火墙命令总结
    Spring Data Elasticsearch自定义方法的各类约定、写法!
    Mysql8.0数据库url时区问题,时间对应不上
    SpringBoot整合WebMagic一次踩坑记录:java.lang.IncompatibleClassChangeError: null
    HttpClient抓取数据出现java.net.URISyntaxException: Expected authority at index 8: https://
  • 原文地址:https://www.cnblogs.com/jerry1999/p/4175919.html
Copyright © 2020-2023  润新知