package com.hx.auto;
|
|
import java.io.File;
|
import java.io.FileFilter;
|
import java.io.IOException;
|
import java.net.URL;
|
import java.net.URLDecoder;
|
import java.util.Enumeration;
|
import java.util.LinkedHashSet;
|
import java.util.Set;
|
|
import com.gitee.sunchenbin.mybatis.actable.annotation.Table;
|
import com.hx.auto.common.UrlData;
|
|
/**
|
* 自动生成工具
|
* 2019-08-29
|
* @author hx
|
*
|
*/
|
public class GeneratorUtil {
|
|
public static void main(String[] args) throws Exception {
|
System.out.println("开始");
|
UrlData urlData = new UrlData();
|
urlData.setTotalUrl("com.hx");
|
urlData.actionUrlData("src.main.java","com.hx.controller.admin");
|
urlData.daoUrlData("src.main.java","com.hx.dao.mapper");
|
urlData.serviceUrlData("src.main.java","com.hx.service");
|
urlData.serviceImplUrlData("src.main.java","com.hx.service.impl");
|
urlData.mapperUrlData("src.main.java", "com.hx.dao.mapperXml");
|
|
/*//dao
|
generatorDao(SysAdmin.class,urlData);
|
//mapper
|
generatorMapper(SysAdmin.class, urlData);
|
//action
|
generatorAction(SysAdmin.class,urlData);
|
// 生成service
|
generatorService(SysAdmin.class,urlData);*/
|
|
//generatorTableByPackUrl(packPath, urlData);
|
|
/*Class cl = TestM2.class;
|
Field[] fields = cl.getDeclaredFields();
|
for(Field field:fields) {
|
System.out.println("field.getName():"+field.getName());
|
System.out.println("field.getType():"+field.getType());
|
System.out.println("field.getGenericType():"+field.getGenericType());
|
System.out.println("field.getModifiers():"+field.getModifiers());
|
}*/
|
|
//StringBuffer stringBuffer = SimpleToolUtil.getFileContent("com/hx/auto/file/test.txt");
|
//System.out.println("stringBuffer:"+stringBuffer);
|
}
|
|
/**通过包路径获取xml和mapper
|
*
|
* @param packPath 包路径
|
* @param urlData 生成文件的配置
|
*/
|
public static <T> void generatorXmlAndMapper(String packPath,UrlData urlData) {
|
try {
|
Set<Class<?>> classes = classData(packPath);
|
for(Class<?> cl:classes) {
|
//action
|
//generatorAction(cl,urlData);
|
//dao
|
generatorDao(cl,urlData);
|
//mapper.xml
|
generatorMapper(cl, urlData);
|
// 生成service
|
//generatorService(cl,urlData);
|
}
|
}catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
|
/**通过包路径获取所有文件
|
*
|
* @param packPath 包路径
|
* @param urlData 生成文件的配置
|
*/
|
public static <T> void generatorTableByPackUrl(String packPath,UrlData urlData) {
|
try {
|
Set<Class<?>> classes = classData(packPath);
|
for(Class<?> cl:classes) {
|
//action
|
generatorAction(cl,urlData);
|
//dao
|
generatorDao(cl,urlData);
|
//mapper.xml
|
generatorMapper(cl, urlData);
|
// 生成service
|
generatorService(cl,urlData);
|
}
|
}catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
|
/**自动生成dao文件
|
*
|
* @param cl 指定生成类
|
* @param urlData 生成文件的配置文件
|
*/
|
public static <T> void generatorDao(Class<?> cl,UrlData urlData) {
|
try {
|
//判断是否有标志,没有标志就跳过
|
if (null != cl.getAnnotation(Table.class)) {
|
// 生成action
|
GeneratorDaoUtil.generatorDao(cl,urlData);
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
|
/**自动生成mapper.xml文件
|
*
|
* @param cl 指定生成类
|
* @param urlData 生成文件的配置文件
|
*/
|
public static <T> void generatorMapper(Class<?> cl,UrlData urlData) {
|
try {
|
//判断是否有标志,没有标志就跳过
|
if (null != cl.getAnnotation(Table.class)) {
|
// 生成action
|
GeneratorMapperUtil.generatorMapper(cl, urlData);
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
|
|
/**自动生成action文件
|
*
|
* @param cl 指定生成类
|
* @param urlData 生成文件的配置文件
|
*/
|
public static <T> void generatorAction(Class<?> cl,UrlData urlData) {
|
try {
|
//生成动态sql的文件(sqlSentence.java),已经生成就不用生成,否则会覆盖
|
/*if(sqlParam) {
|
GeneratorsqlSentenceUtil.GeneratorsqlSentence(urlData);
|
}*/
|
//判断是否有标志,没有标志就跳过
|
if (null != cl.getAnnotation(Table.class)) {
|
// 生成action
|
GeneratorActionUtil.generatorAction(cl, urlData, false);
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
/**自动生成Service and ServiceImpl文件
|
*
|
* @param cl 指定生成类
|
* @param urlData 生成文件的配置文件
|
*/
|
public static <T> void generatorService(Class<?> cl,UrlData urlData) {
|
try {
|
//判断是否有标志,没有标志就跳过
|
if (null != cl.getAnnotation(Table.class)) {
|
// 生成action
|
GeneratorServiceUtil.generatorService(cl,urlData);
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
|
/**获取包下面的所有文件*/
|
public static Set<Class<?>> classData(String packPath){
|
Set<Class<?>> classes = new LinkedHashSet<Class<?>>();
|
// 是否循环迭代
|
boolean recursive = true;
|
// 获取包的名字 并进行替换
|
String packageName = packPath;
|
String packageDirName = packageName.replace('.', '/');
|
// 定义一个枚举的集合 并进行循环来处理这个目录下的things
|
Enumeration<URL> dirs;
|
try{
|
dirs = Thread.currentThread().getContextClassLoader().getResources(packageDirName);
|
// 循环迭代下去
|
while (dirs.hasMoreElements()){
|
// 获取下一个元素
|
URL url = dirs.nextElement();
|
// 得到协议的名称
|
String protocol = url.getProtocol();
|
// 如果是以文件的形式保存在服务器上
|
if ("file".equals(protocol)) {
|
System.err.println("file类型的扫描:" + packPath);
|
// 获取包的物理路径
|
String filePath = URLDecoder.decode(url.getFile(), "UTF-8");
|
// 以文件的方式扫描整个包下的文件 并添加到集合中
|
findAndAddClassesInPackageByFile(packageName, filePath, recursive, classes);
|
}
|
}
|
}catch (IOException e){
|
e.printStackTrace();
|
}
|
return classes;
|
}
|
|
/**
|
* 以文件的形式来获取包下的所有Class
|
*
|
* @param packageName
|
* @param packagePath
|
* @param recursive
|
* @param classes
|
*/
|
public static void findAndAddClassesInPackageByFile(
|
String packageName,
|
String packagePath,
|
final boolean recursive,
|
Set<Class<?>> classes){
|
// 获取此包的目录 建立一个File
|
File dir = new File(packagePath);
|
// 如果不存在或者 也不是目录就直接返回
|
if (!dir.exists() || !dir.isDirectory()) {
|
// log.warn("用户定义包名 " + packageName + " 下没有任何文件");
|
return;
|
}
|
// 如果存在 就获取包下的所有文件 包括目录
|
File[] dirfiles = dir.listFiles(new FileFilter(){
|
// 自定义过滤规则 如果可以循环(包含子目录) 或则是以.class结尾的文件(编译好的java类文件)
|
public boolean accept(File file){
|
return (recursive && file.isDirectory()) || (file.getName().endsWith(".class"));
|
}
|
});
|
// 循环所有文件
|
for (File file : dirfiles){
|
// 如果是目录 则继续扫描
|
if (file.isDirectory()) {
|
findAndAddClassesInPackageByFile(packageName + "." + file.getName(), file.getAbsolutePath(), recursive, classes);
|
}else{
|
// 如果是java类文件 去掉后面的.class 只留下类名
|
String className = file.getName().substring(0, file.getName().length() - 6);
|
try{
|
// 添加到集合中去
|
// classes.add(Class.forName(packageName + '.' +
|
// className));
|
// 经过回复同学的提醒,这里用forName有一些不好,会触发static方法,没有使用classLoader的load干净
|
classes.add(Thread.currentThread().getContextClassLoader().loadClass(packageName + '.' + className));
|
}catch (ClassNotFoundException e){
|
// log.error("添加用户自定义视图类错误 找不到此类的.class文件");
|
e.printStackTrace();
|
}
|
}
|
}
|
}
|
}
|