java动态创建class
借用别人写的demo重新封装了代码
这是封装好了的工具,有点low,时间充裕的伙伴再优化下,记得留言分享哈
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Method;
import java.net.URI;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import javax.tools.FileObject;
import javax.tools.ForwardingJavaFileManager;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileManager;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import net.sf.json.JSONObject;
public class CreateCustomJavaBean
{
private String classString;//java 类创建字符串
private String className;//java类名称
private Object customObject;//当前创建的Class对象
@SuppressWarnings("unchecked")
public CreateCustomJavaBean(List<JSONObject> attributes, String className)
throws Exception
{
if (className == null || "".equals(className))
throw new Exception("动态创建JAVA类,类名称不可为空!");
if (attributes == null || attributes.size() <= 0)
throw new Exception("动态创建JAVA类,属性不可为空!");
className = className.substring(0, 1).toUpperCase() + className.substring(1);//首字母大写
//遍历属性
List<JSONObject> jsonList = attributes;
StringBuffer customBuffer = new StringBuffer();
customBuffer.append("public class ").append(className).append("{");
for (JSONObject jsonObject : jsonList)
{
Iterator<String> it = jsonObject.keys();
while (it.hasNext())
{
String attibutename = it.next().trim();
String datatype = jsonObject.getString(attibutename).trim();
if ("".equals(attibutename))
throw new Exception("属性名称不允许为空");
if ("".equals(datatype))
throw new Exception("属性数据类型不允许为空");
//添加属性和数据类型
customBuffer.append("private ").append(datatype).append(" ").append(attibutename).append(";");
}
}
for (JSONObject jsonObject : jsonList)
{
Iterator<String> it = jsonObject.keys();
while (it.hasNext())
{
String attibutename = it.next().trim();
String datatype = jsonObject.getString(attibutename).trim();
if ("".equals(attibutename))
throw new Exception("属性名称不允许为空");
if ("".equals(datatype))
throw new Exception("属性数据类型不允许为空");
//添加getter、setter方法
//首字母大写
String upcaseName = attibutename.substring(0, 1).toUpperCase() + attibutename.substring(1);
//setter方法
customBuffer.append("public void set")
.append(upcaseName)
.append("(")
.append(datatype)
.append(" ")
.append(attibutename)
.append("){");
customBuffer.append("this.").append(attibutename).append("=").append(attibutename).append(";");
customBuffer.append("}");
//getter方法
customBuffer.append("public ").append(datatype).append(" get").append(upcaseName).append("(){");
customBuffer.append("return this.").append(attibutename).append(";");
customBuffer.append("}");
}
}
customBuffer.append("}");
this.classString = customBuffer.toString();
this.className = className;
}
/**
* 创建javaBean
*/
public Object createJavaBean()
throws Exception
{
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager standardFileManager = compiler.getStandardFileManager(null, null, null);
CustomJavaFileManager classJavaFileManager = new CustomJavaFileManager(standardFileManager);
StringObject stringObject =
new StringObject(new URI(this.className + ".java"), JavaFileObject.Kind.SOURCE, this.classString);
JavaCompiler.CompilationTask task =
compiler.getTask(null, classJavaFileManager, null, null, null, Arrays.asList(stringObject));
if (task.call())
{
ClassJavaFileObject javaFileObject = classJavaFileManager.getClassJavaFileObject();
ClassLoader classLoader = new CustomClassLoader(javaFileObject);
this.customObject = classLoader.loadClass(this.className).newInstance();
return this.customObject;
}
return null;
}
/**
* setter 保存数据
*/
public void setValueMethod(String attributename, String classtype, Object value)
throws Exception
{
attributename = "set" + attributename.substring(0, 1).toUpperCase() + attributename.substring(1);
Method setStudentIdMethod = this.customObject.getClass().getMethod(attributename, Class.forName(classtype));
if (setStudentIdMethod == null)
throw new Exception("未加载到属性setter方法");
setStudentIdMethod.invoke(this.customObject, value);
}
/**
* getter 获取数据
*/
public Object getValueMethod(String attributename)
throws Exception
{
attributename = "get" + attributename.substring(0, 1).toUpperCase() + attributename.substring(1);
Method customMethod = this.customObject.getClass().getMethod(attributename);
if (customMethod == null)
throw new Exception("未加载到属性getter方法");
Object studentId = customMethod.invoke(this.customObject);
return studentId;
}
/**
* 自定义fileManager
*/
@SuppressWarnings("rawtypes")
private class CustomJavaFileManager extends ForwardingJavaFileManager
{
private ClassJavaFileObject classJavaFileObject;
@SuppressWarnings("unchecked")
public CustomJavaFileManager(JavaFileManager fileManager)
{
super(fileManager);
}
public ClassJavaFileObject getClassJavaFileObject()
{
return classJavaFileObject;
}
//这个方法一定要自定义
@Override
public JavaFileObject getJavaFileForOutput(Location location, String className, JavaFileObject.Kind kind,
FileObject sibling)
throws IOException
{
return (classJavaFileObject = new ClassJavaFileObject(className, kind));
}
}
/**
* 存储源文件
*/
private class StringObject extends SimpleJavaFileObject
{
private String content;
public StringObject(URI uri, Kind kind, String content)
{
super(uri, kind);
this.content = content;
}
@Override
public CharSequence getCharContent(boolean ignoreEncodingErrors)
throws IOException
{
return this.content;
}
}
/**
* class文件(不需要存到文件中)
*/
private class ClassJavaFileObject extends SimpleJavaFileObject
{
ByteArrayOutputStream outputStream;
public ClassJavaFileObject(String className, Kind kind)
{
super(URI.create(className + kind.extension), kind);
this.outputStream = new ByteArrayOutputStream();
}
//这个也要实现
@Override
public OutputStream openOutputStream()
throws IOException
{
return this.outputStream;
}
public byte[] getBytes()
{
return this.outputStream.toByteArray();
}
}
/**
* 自定义classloader
*/
private class CustomClassLoader extends ClassLoader
{
private ClassJavaFileObject stringObject;
public CustomClassLoader(ClassJavaFileObject stringObject)
{
this.stringObject = stringObject;
}
@Override
protected Class<?> findClass(String name)
throws ClassNotFoundException
{
byte[] bytes = this.stringObject.getBytes();
return defineClass(name, bytes, 0, bytes.length);
}
}
}
工具试用调用测试代码案例
public static void testCreatJavaBean()
{
try
{
List<JSONObject> jsonArray = new ArrayList<JSONObject>();
JSONObject attributes = new JSONObject();
attributes.put("table_name", "java.lang.String");
attributes.put("table_comments", "java.lang.String");
attributes.put("column_name", "java.lang.String");
attributes.put("comments", "java.lang.String");
attributes.put("data_type", "java.lang.String");
attributes.put("data_length", "java.lang.String");
attributes.put("nullable", "java.lang.String");
attributes.put("data_default", "java.lang.String");
attributes.put("low_value", "java.lang.String");
attributes.put("high_value", "java.lang.String");
jsonArray.add(attributes);
CreateCustomJavaBean javafactoryBean = new CreateCustomJavaBean(jsonArray, "databaseInfo");
//创建JAVABean
javafactoryBean.createJavaBean();
//设置数据
javafactoryBean.setValueMethod("table_name"/*属性名称*/, "java.lang.String"/*数据类型*/, "T_H_PRODUCT"/*要保存的数据*/);
//获取数据
Object table_name = javafactoryBean.getValueMethod("table_name");
System.out.println(table_name);
}
catch (Exception e)
{
e.printStackTrace();
}
}
输出结果
T_H_PRODUCT
导出Excel代码案例,主要参考第一个案例就行,导出Excel的代码也是经过封装的,目前主要用途是后台导出Excel
public void exportDatabaseTableInfoToSingleFile_Test(JSONObject tableCommentMap, JSONArray columnsInfosArray,
JSONObject jsonObject)
throws Exception
{
// Excel表头
String[] headers = {"数据表名", "数据表注释", "字段名称", "字段注释", "数据类型", "数据长度", "是否允许为空", "默认数据", "最小值", "最大值"};
String fileName = "数据库数据表字段信息.xls";// 创建文件名称
List<Object> excelBeanList = new ArrayList<Object>();
GenerateToExcelBean toExcelBean = new GenerateToExcelBean();// excel导出javaBean
List<JSONObject> columnsInfoList = JSONArray.toList(columnsInfosArray, JSONObject.class);
for (JSONObject json : columnsInfoList)
{
String className = "CustomExportToExcelOfDataBaseInfo";
List<String> attributeList = new ArrayList<String>();
attributeList.add("table_name");
attributeList.add("table_comments");
attributeList.add("column_name");
attributeList.add("comments");
attributeList.add("data_type");
attributeList.add("data_length");
attributeList.add("nullable");
attributeList.add("data_default");
attributeList.add("low_value");
attributeList.add("high_value");
//保存属性信息
List<JSONObject> jsonArray = new ArrayList<JSONObject>();
for (String attributename : attributeList)
{
JSONObject attributes = new JSONObject();
attributes.put(attributename, "java.lang.String");
jsonArray.add(attributes);
}
//动态创建自定义JAVABean
CreateCustomJavaBean javafactoryBean = new CreateCustomJavaBean(jsonArray, className);
//执行创建javaBean
Object customExportToExcelBean = javafactoryBean.createJavaBean();
for (String attributename : attributeList)
{
if ("table_name".equals(attributename))
{
String table_name = json.getString(attributename);
String table_comments = "";
if (!tableCommentMap.containsKey(table_name) || tableCommentMap.get(table_name) == null)
table_comments = "";
else
table_comments = tableCommentMap.getString(table_name);
table_comments = table_comments == null ? "" : table_comments;
//JAVA Bean setter方法
javafactoryBean.setValueMethod("table_comments", "java.lang.String", table_comments);
}
else if ("table_comments".equals(attributename))
continue;
//JAVA Bean setter方法
javafactoryBean.setValueMethod(attributename, "java.lang.String", json.getString(attributename));
}
excelBeanList.add(customExportToExcelBean);
}
// 保存文件
String filePath = toExcelBean.GenerateToExcel(headers, excelBeanList, fileName);
// 6. 返回文件路径
jsonObject.put("fileName", fileName);
jsonObject.put("filePath", filePath);
}