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);
 }
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值