chenjiahe
2024-09-23 826b66207dafbce24f441cb83fed1b241a6fba27
提交 | 用户 | age
826b66 1 package com.hx.auto;
C 2
3 import java.io.File;
4 import java.io.FileFilter;
5 import java.io.IOException;
6 import java.net.URL;
7 import java.net.URLDecoder;
8 import java.util.Enumeration;
9 import java.util.LinkedHashSet;
10 import java.util.Set;
11
12 import com.gitee.sunchenbin.mybatis.actable.annotation.Table;
13 import com.hx.auto.common.UrlData;
14
15 /**
16  * 自动生成工具 
17  * 2019-08-29
18  * @author hx
19  *
20  */
21 public class GeneratorUtil {
22     
23     public static void main(String[] args) throws Exception {
24         System.out.println("开始");
25         UrlData urlData = new UrlData();
26         urlData.setTotalUrl("com.hx");
27         urlData.actionUrlData("src.main.java","com.hx.controller.admin");
28         urlData.daoUrlData("src.main.java","com.hx.dao.mapper");
29         urlData.serviceUrlData("src.main.java","com.hx.service");
30         urlData.serviceImplUrlData("src.main.java","com.hx.service.impl");
31         urlData.mapperUrlData("src.main.java", "com.hx.dao.mapperXml");
32         
33         /*//dao
34         generatorDao(SysAdmin.class,urlData);
35         //mapper
36         generatorMapper(SysAdmin.class, urlData);
37         //action
38         generatorAction(SysAdmin.class,urlData);
39         // 生成service
40         generatorService(SysAdmin.class,urlData);*/
41
42         //generatorTableByPackUrl(packPath, urlData);
43         
44         /*Class cl = TestM2.class;
45         Field[] fields = cl.getDeclaredFields();
46         for(Field field:fields) {
47             System.out.println("field.getName():"+field.getName());
48             System.out.println("field.getType():"+field.getType());
49             System.out.println("field.getGenericType():"+field.getGenericType());
50             System.out.println("field.getModifiers():"+field.getModifiers());
51         }*/
52         
53         //StringBuffer stringBuffer = SimpleToolUtil.getFileContent("com/hx/auto/file/test.txt");
54         //System.out.println("stringBuffer:"+stringBuffer);
55     }
56
57     /**通过包路径获取xml和mapper
58      *
59      * @param packPath 包路径
60      * @param urlData 生成文件的配置
61      */
62     public static <T> void generatorXmlAndMapper(String packPath,UrlData urlData) {
63         try {
64             Set<Class<?>> classes = classData(packPath);
65             for(Class<?> cl:classes) {
66                 //action
67                 //generatorAction(cl,urlData);
68                 //dao
69                 generatorDao(cl,urlData);
70                 //mapper.xml
71                 generatorMapper(cl, urlData);
72                 // 生成service
73                 //generatorService(cl,urlData);
74             }
75         }catch (Exception e) {
76             e.printStackTrace();
77         }
78     }
79
80     /**通过包路径获取所有文件
81      * 
82      * @param packPath 包路径
83      * @param urlData 生成文件的配置
84      */
85     public static <T> void generatorTableByPackUrl(String packPath,UrlData urlData) {
86         try {
87             Set<Class<?>> classes = classData(packPath);
88             for(Class<?> cl:classes) {
89                 //action
90                 generatorAction(cl,urlData);
91                 //dao
92                 generatorDao(cl,urlData);
93                 //mapper.xml
94                 generatorMapper(cl, urlData);
95                 // 生成service
96                 generatorService(cl,urlData);
97             }
98         }catch (Exception e) {
99             e.printStackTrace();
100         }
101     }
102     
103     /**自动生成dao文件
104      * 
105      * @param cl 指定生成类
106      * @param urlData 生成文件的配置文件
107      */
108     public static <T> void generatorDao(Class<?> cl,UrlData urlData) {
109         try {
110             //判断是否有标志,没有标志就跳过
111             if (null != cl.getAnnotation(Table.class)) {
112                 // 生成action
113                 GeneratorDaoUtil.generatorDao(cl,urlData);
114             }
115         } catch (Exception e) {
116             e.printStackTrace();
117         }
118     }
119     
120     /**自动生成mapper.xml文件
121      * 
122      * @param cl 指定生成类
123      * @param urlData 生成文件的配置文件
124      */
125     public static <T> void generatorMapper(Class<?> cl,UrlData urlData) {
126         try {
127             //判断是否有标志,没有标志就跳过
128             if (null != cl.getAnnotation(Table.class)) {
129                 // 生成action
130                 GeneratorMapperUtil.generatorMapper(cl, urlData);
131             }
132         } catch (Exception e) {
133             e.printStackTrace();
134         }
135     }
136
137
138     /**自动生成action文件
139      *
140      * @param cl 指定生成类
141      * @param urlData 生成文件的配置文件
142      */
143     public static <T> void generatorAction(Class<?> cl,UrlData urlData) {
144         try {
145             //生成动态sql的文件(sqlSentence.java),已经生成就不用生成,否则会覆盖
146             /*if(sqlParam) {
147                 GeneratorsqlSentenceUtil.GeneratorsqlSentence(urlData);
148             }*/
149             //判断是否有标志,没有标志就跳过
150             if (null != cl.getAnnotation(Table.class)) {
151                 // 生成action
152                 GeneratorActionUtil.generatorAction(cl, urlData, false);
153             }
154         } catch (Exception e) {
155             e.printStackTrace();
156         }
157     }
158     /**自动生成Service and ServiceImpl文件
159      *
160      * @param cl 指定生成类
161      * @param urlData 生成文件的配置文件
162      */
163     public static <T> void generatorService(Class<?> cl,UrlData urlData) {
164         try {
165             //判断是否有标志,没有标志就跳过
166             if (null != cl.getAnnotation(Table.class)) {
167                 // 生成action
168                 GeneratorServiceUtil.generatorService(cl,urlData);
169             }
170         } catch (Exception e) {
171             e.printStackTrace();
172         }
173     }
174     
175     /**获取包下面的所有文件*/
176     public static Set<Class<?>> classData(String packPath){
177         Set<Class<?>> classes = new LinkedHashSet<Class<?>>();
178         // 是否循环迭代
179         boolean recursive = true;
180         // 获取包的名字 并进行替换
181         String packageName = packPath;
182         String packageDirName = packageName.replace('.', '/');
183         // 定义一个枚举的集合 并进行循环来处理这个目录下的things
184         Enumeration<URL> dirs;
185         try{
186             dirs = Thread.currentThread().getContextClassLoader().getResources(packageDirName);
187             // 循环迭代下去
188             while (dirs.hasMoreElements()){
189                 // 获取下一个元素
190                 URL url = dirs.nextElement();
191                 // 得到协议的名称
192                 String protocol = url.getProtocol();
193                 // 如果是以文件的形式保存在服务器上
194                 if ("file".equals(protocol)) {
195                     System.err.println("file类型的扫描:" + packPath);
196                     // 获取包的物理路径
197                     String filePath = URLDecoder.decode(url.getFile(), "UTF-8");
198                     // 以文件的方式扫描整个包下的文件 并添加到集合中
199                     findAndAddClassesInPackageByFile(packageName, filePath, recursive, classes);
200                 }
201             }
202         }catch (IOException e){
203             e.printStackTrace();
204         }
205         return classes;
206     }
207     
208     /**
209      * 以文件的形式来获取包下的所有Class
210      * 
211      * @param packageName
212      * @param packagePath
213      * @param recursive
214      * @param classes
215      */
216     public static void findAndAddClassesInPackageByFile(
217             String packageName,
218             String packagePath,
219             final boolean recursive,
220             Set<Class<?>> classes){
221         // 获取此包的目录 建立一个File
222         File dir = new File(packagePath);
223         // 如果不存在或者 也不是目录就直接返回
224         if (!dir.exists() || !dir.isDirectory()) {
225             // log.warn("用户定义包名 " + packageName + " 下没有任何文件");
226             return;
227         }
228         // 如果存在 就获取包下的所有文件 包括目录
229         File[] dirfiles = dir.listFiles(new FileFilter(){
230             // 自定义过滤规则 如果可以循环(包含子目录) 或则是以.class结尾的文件(编译好的java类文件)
231             public boolean accept(File file){
232                 return (recursive && file.isDirectory()) || (file.getName().endsWith(".class"));
233             }
234         });
235         // 循环所有文件
236         for (File file : dirfiles){
237             // 如果是目录 则继续扫描
238             if (file.isDirectory()) {
239                 findAndAddClassesInPackageByFile(packageName + "." + file.getName(), file.getAbsolutePath(), recursive, classes);
240             }else{
241                 // 如果是java类文件 去掉后面的.class 只留下类名
242                 String className = file.getName().substring(0, file.getName().length() - 6);
243                 try{
244                     // 添加到集合中去
245                     // classes.add(Class.forName(packageName + '.' +
246                     // className));
247                     // 经过回复同学的提醒,这里用forName有一些不好,会触发static方法,没有使用classLoader的load干净
248                     classes.add(Thread.currentThread().getContextClassLoader().loadClass(packageName + '.' + className));
249                 }catch (ClassNotFoundException e){
250                     // log.error("添加用户自定义视图类错误 找不到此类的.class文件");
251                     e.printStackTrace();
252                 }
253             }
254         }
255     }
256 }