1.获取包下的所有实体class工具类
package com.ndcims.core.utils;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
* TODO 包的工具类
* @author 洋洋懒懒小公举
* @Date 创建于 2017-9-5 上午9:08:06
* @version v1.0
* @Copyright 2017 www.rinpo.com Inc. All rights reserved.
*/
public class PackageUtil {
/**
* TODO 使用举例
* @param args
* @throws ClassNotFoundException
*
* @author 洋洋懒懒小公举
* @Date Create at 2017-9-5 下午3:41:01
*/
public static void main(String[] args) throws ClassNotFoundException {
String packageName = "com.ndcims.cms.entity";
List<String> classNames = getClassName(packageName);
//className格式eg:com.ndcims.cms.entity.CmsFirstDaySetting
for (String className : classNames) {
//根据类名通过反射机制得到这个类
Class<?> clzz=Class.forName(className);
//eg:com.ndcims.cms.entity.CmsFirstDaySetting
System.out.println(clzz.getName());
}
}
/**
* TODO 中间方法,格式化包名,再调用核心方法
* @param packageName
* @return
* @author 洋洋懒懒小公举
* @Date Create at 2017-9-5 上午9:31:31
*/
public static List<String> getClassName(String packageName) {
String filePath = ClassLoader.getSystemResource("").getPath() + packageName.replace(".", "\\");
List<String> fileNames = getClassName(packageName,filePath, null);
return fileNames;
}
/**
* TODO 核心方法,根据包名获取包下面的所有类名
* @param filePath
* @param className
* @author 洋洋懒懒小公举
* @Date Create at 2017-9-5 上午9:30:31
*/
private static List<String> getClassName(String packageName,String filePath, List<String> className) {
List<String> myClassName = new ArrayList<String>();
File file = new File(filePath);
File[] childFiles = file.listFiles();
for (File childFile : childFiles) {
if (childFile.isDirectory()) {
myClassName.addAll(getClassName(packageName,childFile.getPath(), myClassName));
} else {
String childFilePath = childFile.getPath();
//以下的字符串拼接可以根据情况拼接
childFilePath = childFilePath.substring(childFilePath.indexOf(packageName.replace(".", "\\")), childFilePath.lastIndexOf("."));
//格式eg:com.ndcims.cms.entity.CmsFirstDaySetting
childFilePath = childFilePath.replace("\\", ".");
myClassName.add(childFilePath);
}
}
return myClassName;
}
}
2.生成dateSet和xml的国际化文件的工具类
package com.ndcims.core.utils;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.List;
import org.dom4j.DocumentException;
import com.bstek.dorado.annotation.PropertyDef;
/**
* TODO 生成国际化文件工具类
* @author 洋洋懒懒小公举
* @Date 创建于 2017-9-4 下午2:47:45
* @version v1.0
* @Copyright 2017 www.rinpo.com Inc. All rights reserved.
*/
public class EntityForInternationalUtil {
public String baseEntityName = "com.ndcims.core.base.BaseEntity";
/**
* TODO 根据包名获取dateSet国际化
* @param packageName
* @throws ClassNotFoundException
* @throws DocumentException
* @author 洋洋懒懒小公举
* @Date Create at 2017-9-5 上午10:15:52
*/
public void generateModelByPackage(String packageName) throws ClassNotFoundException, DocumentException{
List<String> classNames = PackageUtil.getClassName(packageName);
//className格式eg:com.ndcims.cms.entity.CmsFirstDaySetting
for (String className : classNames) {
//根据类名通过反射机制得到这个类
Class<?> clzz=Class.forName(className);
//如果这个类里包含注解(也就是label),就生成国际化文件,否则不需要
if(this.isHavePropertyDef(clzz)){
this.generateModelResource(clzz); //生成国际化文件 =第一步
}
}
}
/**
* TODO 根据包名获取xml文件 代码
* @param packageName
* @throws ClassNotFoundException
* @throws DocumentException
* @author 洋洋懒懒小公举
* @Date Create at 2017-9-5 上午10:15:22
*/
public void generateModelXMLByPackage(String packageName,String name) throws ClassNotFoundException, DocumentException{
System.out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
System.out.println("<Model>");
List<String> classNames = PackageUtil.getClassName(packageName);
for (String className : classNames) {
//根据类名通过反射机制得到这个类
Class<?> clzz=Class.forName(className);
this.generateModelXML(clzz,name);//生成model的label =第二步
}
System.out.println("</Model>");
}
/**
* TODO 根据实体类生成国际化资源文件
* @param clzz
* @throws DocumentException
* @author 洋洋懒懒小公举
* @throws ClassNotFoundException
* @Date Create at 2017-9-4 下午3:15:51
*/
public void generateModelResource(@SuppressWarnings("rawtypes") Class clzz)
throws DocumentException, ClassNotFoundException {
// 获取dateSet名称
String dataSetID = "ds" + clzz.getSimpleName();
System.out.println("#==========================================");
System.out.println("#当前DataSet的ID为:" + dataSetID);
System.out.println("#==========================================");
// 获取对象中所有的Field
Field[] fields = clzz.getDeclaredFields();
this.systemOutDateSetColumn(dataSetID, fields);
Class<?> baseEntity = Class.forName(baseEntityName);
//如果继承了baseEntity,便把baseEntity的字段加上去
if(baseEntity.isAssignableFrom(clzz)){
Field[] fields1 = baseEntity.getDeclaredFields();
this.systemOutDateSetColumn(dataSetID, fields1);
}
}
/**
* TODO 根据实体,以及国际化文件所在文件的名称生成一个dateType的XML
* @param clzz
* @param name
* dataSet国际化文件所在文件的名称
* @author 洋洋懒懒小公举
* @throws ClassNotFoundException
* @Date Create at 2017-9-4 下午5:03:59
*/
@SuppressWarnings("unchecked")
public void generateModelXML(@SuppressWarnings("rawtypes") Class clzz,
String name) throws ClassNotFoundException {
System.out
.println(" <DataType name=\"dt" + clzz.getSimpleName() + "\">");
System.out.println(" <Property name=\"matchType\">" + clzz.getName()
+ "</Property>");
String dataSetID = "ds" + clzz.getSimpleName();
Field[] fields = clzz.getDeclaredFields();
this.systemOutXmlColumn(dataSetID,fields,name);
@SuppressWarnings("rawtypes")
Class baseEntity = Class.forName(baseEntityName);
//如果继承了baseEntity,便把baseEntity的字段加上去
if(baseEntity.isAssignableFrom(clzz)){
Field[] fields1 = baseEntity.getDeclaredFields();
this.systemOutXmlColumn(dataSetID,fields1,name);
}
System.out.println(" </DataType>");
}
/**
* TODO 判断某个类中的字段是否含有 PropertyDef注解,没有就无需生成dateSet国际化文件
* @param clzz
* @author 洋洋懒懒小公举
* @Date Create at 2017-9-5 下午3:32:33
*/
public boolean isHavePropertyDef(@SuppressWarnings("rawtypes") Class clzz){
Field[] fields = clzz.getDeclaredFields();
for (Field field : fields) {
if (field.isAnnotationPresent(PropertyDef.class)) {
return true;
}
}
return false;
}
/**
* TODO 生成实体的列名dateset国际化
* @param dataSetID
* 指定dateSet名称
* @param fields
* @author 洋洋懒懒小公举
* @Date Create at 2017-9-6 上午10:31:09
*/
public void systemOutDateSetColumn(String dataSetID,Field[] fields){
for (Field field : fields) {
if (field.isAnnotationPresent(PropertyDef.class)) {
// 获取字段名
String fieldNames = dataSetID + "." + field.getName();
// 获取字段注解
Annotation annotation = field.getAnnotation(PropertyDef.class);
// 获取注解中的字段label
String label = ((PropertyDef) annotation).label();
System.out.print(fieldNames + "=");
System.out.println(label);
}
}
}
public void systemOutXmlColumn(String dataSetID,Field[] fields,String name){
// 获取对象中所有的字段
for (Field field : fields) {
if(!field.getName().equals("serialVersionUID")){
// 获取类型
String dateType = field.getType().getName();
// 获取字段名
String fieldNames = dataSetID + "." + field.getName();
System.out.println(" <PropertyDef name=\"" + field.getName()
+ "\">");
if (!dateType.equals("java.lang.String") && !dateType.equals("[B")) {
String realDateType = dateType;
String[] str = realDateType.split("\\.");
if (str.length > 1) {
realDateType = str[2];
}
System.out.println(" <Property name=\"dataType\">"
+ realDateType + "</Property>");
}
//是否有PropertyDef注解
if (field.isAnnotationPresent(PropertyDef.class)) {
String text = "${res["" + name + "/" + fieldNames
+ ""]}";
System.out.println(" <Property name=\"label\">" + text
+ "</Property>");
}
System.out.println(" </PropertyDef>");
}
}
}
}
3.使用
package com.ndcims.cms.aaaaademo;
import org.dom4j.DocumentException;
import com.ndcims.core.utils.EntityForInternationalUtil;
/**
* TODO 生成国际化文件 ,请配置一个txt文件接收输出的国际化文件
* Console窗口很可能展示不全
* @author 洋洋懒懒小公举
* @Date 创建于 2017-9-4 下午2:37:40
* @version v1.0
* @Copyright 2017 www.rinpo.com Inc. All rights reserved.
*/
public class Demo {
public static void main(String[] args) throws DocumentException, ClassNotFoundException {
String packageName = "com.ndcims.cms.entity";
EntityForInternationalUtil t = new EntityForInternationalUtil();
//t.generateModelByPackage(packageName); //生成国际化文件 =第一步
t.generateModelXMLByPackage(packageName,"Cms");//生成model的label =第二步
}
}
花费有效时间约:1天 ~(≧▽≦)/~