단순 자바 코드 생 성기

최근 에 회사 에서 새로운 프로젝트 를 열 었 는데 많은 기본 적 인 dao 와 service 층 코드 가 중복 되 기 때문에 간단 한 코드 생 성 기 를 써 서 복사 가 번 거 롭 지 않도록 직접 생 성 할 계획 입 니 다.그러나 Velocity 를 사용 할 때 템 플 릿 정 보 를 얻 는 것 이 좀 번 거 로 워 서 설정 을 수정 해 야 합 니 다.차라리 자신 이 간단 하고 실 용적 인 자신 이 사용 하 는 것 을 쓰 고 여기 서도 기록 을 하 며 관심 이 있 는 것 도 볼 수 있 고 생각 을 실현 하 는 것 도 간단 하 다.
코드 는 다음 과 같 습 니 다.
/**
 *   
 * Created by GN on 2016/11/27.
 */
public class GnTest {

    @Test
    public void testGn() throws IOException {
        GnContext gnContext = new GnContext();
        gnContext.put("domain","User");
        gnContext.put("lowerDomain","user");
        String path = "E:\\WorkSpace\\Idea\\ztx\\gn-cc\\src\\main\\resources\\DaoImpl.java";
        Template template = GnUtil.getTemplate(path);
        String target = "G:\\DaoImpl.java";
        File file = new File(target);
        template.merge(gnContext,file);
    }

}
/**
 *        
 * Created by GN on 2016/11/27.
 */
public class GnContext {

    /**
     *      
     */
    private Map context = new HashMap<>();

    public GnContext() {

    }

    public GnContext(Map context) {
        this.context = context;
    }

    public void put(String key, String value) {
        context.put(key, value);
    }

    public String get(String key) {
        return context.get(key);
    }

}
/**
 * Created by GN on 2016/11/27.
 */
public abstract class GnUtil {

    /**
     *       
     * @param filePath     
     * @return
     */
    public static Template getTemplate(String filePath) throws IOException {
        if (!StringUtil.hasLength(filePath)){
            throw new IllegalArgumentException("        ");
        }
        File file = new File(filePath);
        if (!file.isFile() || !file.exists()){
            throw new IllegalArgumentException("        :"+filePath);
        }
        return new Template(file);
    }

}
/**
 *     
 * Created by GN on 2016/11/27.
 */
public class Template {

    private static final String TAG_PREFIX = "${";
    private static final String TAG_POSTFIX = "}";

    /**
     *     
     */
    private BufferedReader reader;
    private File file;
    /**
     *     ,eg:${domain}:key=domain,value=${domain}
     */
    private Map tag = new HashMap<>();

    public Template(File file) throws IOException {
        this.file = file;
        //        
        initReader();
    }

    private void initReader() {
        if (file == null) {
            throw new IllegalArgumentException("      ");
        }
        try {
            InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(file), "UTF-8");
            this.reader = new BufferedReader(inputStreamReader);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }

    /**
     *      tag 
     *
     * @param text
     */
    private void initTag(String text) {
        if (!StringUtil.hasLength(text)) {
            return;
        }
        String tagFlag = getTagFlag(text);
        String tagText = getTagText(text);
        this.tag.put(tagText, tagFlag);
        //            
        int prefix = text.indexOf(TAG_PREFIX);
        String subText = text.substring(prefix + 2 + tagText.length());
        if (hasTag(subText)) {
            initTag(subText);
        }
    }

    /**
     *     ,${domain}
     *
     * @param text
     * @return
     */
    private String getTagFlag(String text) {
        int prefix = text.indexOf(TAG_PREFIX);
        int postfix = text.indexOf(TAG_POSTFIX);
        return text.substring(prefix, postfix + 1);
    }

    /**
     *         ,${domain} --> domain
     *
     * @param text
     * @return
     */
    private String getTagText(String text) {
        String tagFlag = getTagFlag(text);
        return tagFlag.substring(2, tagFlag.length() - 1);
    }

    /**
     *            
     *
     * @param text
     * @return
     */
    private boolean hasTag(String text) {
        if (!StringUtil.hasLength(text)) {
            return Boolean.FALSE;
        }
        return text.indexOf(TAG_PREFIX) > 0 && text.indexOf(TAG_POSTFIX) > 0;
    }

    /**
     *     
     *
     * @param context      
     * @param target        
     */
    public void merge(GnContext context, File target) throws IOException {
        if (reader == null) {
            throw new IllegalArgumentException("      ");
        }
        if (context == null) {
            throw new IllegalArgumentException("  GnContext  ");
        }
        if (target == null) {
            throw new IllegalArgumentException("       ");
        }
        String temp;
        FileWriter writer = new FileWriter(target, true);
        while ((temp = reader.readLine()) != null) {
            if (hasTag(temp)) {
                //        
                List tagTextList = findTagTextList(temp);
                if (!tagTextList.isEmpty()) {
                    for (String text : tagTextList) {
                        String value = context.get(text);
                        if (StringUtil.hasLength(value)){
                            temp = temp.replace(TAG_PREFIX + text + TAG_POSTFIX, value);
                        }
                    }
                }
            }
            writer.write(temp + "
"); writer.flush(); } writer.close(); } /** * * * @param lineText * @return */ private List findTagTextList(String lineText) { List tagTextList = new ArrayList<>(); if (StringUtil.hasLength(lineText) && hasTag(lineText)) { String tmp = lineText; while (hasTag(tmp)) { String tagText = findTagText(tmp); if (!tagTextList.contains(tagText)) { tagTextList.add(tagText); } int begin = tmp.indexOf(tagText); tmp = tmp.substring(begin + tagText.length()+1); } } return tagTextList; } /** * * * @param text * @return */ private String findTagText(String text) { if (!StringUtil.hasLength(text)) { return null; } return getTagText(text); } }

4.567917.테스트 를 위해 템 플 릿 을 사용 합 니 다.4.567918.
/**
 * Created by GNon 2016/9/8.
 */
@Service
@Transactional
public class ${domain}ServiceImpl implements I${domain}Service {

    @Autowired
    private ${domain}Dao dao;

    @Override
    public void save(${domain} ${lowerDomain}) {
        dao.save(${lowerDomain});
    }

    @Override
    public void update(${domain} ${lowerDomain}) {
        dao.update(${lowerDomain});
    }

    @Override
    public void delete(Serializable id) {
        dao.delete(id);
    }

    @Override
    public ${domain} findById(Serializable id) {
        return dao.findById(id);
    }

    @Override
    public List findAll() {
        return dao.findAll();
    }

    @Override
    public PageData findListByPage(PageData pageData) {
        return dao.findListByPage(pageData);
    }
}
  • 다음은 상기 코드 를 통 해 이 루어 진 간단 한 생 성기 이다
  • /**
     *      
     * Created by GN on 2016/11/28.
     */
    public class GnCreator {
    
        /**
         *   
         */
        private List domains = new ArrayList<>();
        /**
         *       
         */
        private String baseTemplatePath = "E:\\WorkSpace\\demo\\src\\main\\resources\\";
        /**
         *           
         */
        private String baseSavePath = "E:\\WorkSpace\\demosrc\\main\\java\\com\\gn\\demo\\";
        /**
         *   
         */
        private List templates = new ArrayList<>();
    
        private final String DAOIMPL = "Dao.java";
        private final String SERVICE = "Service.java";
        private final String SERVICEIMPL = "ServiceImpl.java";
    
        public GnCreator() {
            //        
            //       
            String[] domainList = {"User"}; //      ,              ,         
            List asList = Arrays.asList(domainList);
            domains.addAll(asList);
            //     
            templates.add(DAOIMPL);
            templates.add(SERVICE);
            templates.add(SERVICEIMPL);
        }
    
        public void create() throws IOException {
            System.out.println("         >>>>>>>>>>>>>>>>>>>>");
            for (String domain : domains) {
                System.out.println("      【"+domain+"】  ...............");
                //     
                GnContext gnContext = new GnContext();
                gnContext.put("domain",domain);
                gnContext.put("lowerDomain",domain.toLowerCase());
                //        
                for (String tp : templates) {
                    String templatePath = baseTemplatePath+tp;
                    Template template = GnUtil.getTemplate(templatePath);
                    //               
                    String targetFilePath = "";
                    String targetFileName = "";
                    if (tp.equals(DAOIMPL)){
                        targetFilePath = baseSavePath+"dao\\impl\\";
                        targetFileName = domain+DAOIMPL;
                    }else if (tp.equals(SERVICE)){
                        targetFilePath = baseSavePath+"service\\";
                        targetFileName = "I"+domain+SERVICE;
                    }else if (tp.equals(SERVICEIMPL)){
                        targetFilePath = baseSavePath + "service\\impl\\";
                        targetFileName = domain+SERVICEIMPL;
                    }
                    //        ,        
                    File file = new File(targetFilePath);
                    if (!file.exists()){
                        file.mkdirs();
                    }
                    File targetFile = new File(targetFilePath+targetFileName);
                    template.merge(gnContext,targetFile);
                }
                System.out.println("    【"+domain+"】    ...............");
            }
            System.out.println("         >>>>>>>>>>>>>>>>>>>>>>>>");
        }
    
    }
    

    4.567917.이상 은 모든 코드 입 니 다.자신의 수 요 를 적용 하기 위해 서 입 니 다.다른 사람 에 게 도움 이 된다 면 간단 한 사 고 를 하 겠 습 니 다.코드 의 주요 실현 기능 은 템 플 릿 에 있 는${domain}을 얻 은 다음 에 교체 하 는 방식 으로 들 어 오 는 GnContext 에 대응 하 는 값 을 최종 적 으로 현대 코드 로 생 성 합 니 다.한 곳 을 바 꾸 는 것 은 내 가 직접 검색 해서 바 꾸 는 것 이다.원한 다 면 정규 표현 식 으로 처리 해도 된다.그러면 훨씬 간결 해 질 것 이다

    좋은 웹페이지 즐겨찾기