博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java——动态生成POJO类
阅读量:4583 次
发布时间:2019-06-09

本文共 4867 字,大约阅读时间需要 16 分钟。

package com.java.test.dynamicpojo;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 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;public class DynamicPOJO {        private static String classString = "/* hehha */" + "public class Student{                                  "                + "       private String  studentId;                      "                + "       public String getStudentId(){                   "                + "           return \"小明\";                      "                + "       }                                               "                + "}                                                    ";        private static void createStudent() throws Exception {            JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();            StandardJavaFileManager standardFileManager = compiler.getStandardFileManager(null, null, null);            ClassJavaFileManager classJavaFileManager = new ClassJavaFileManager(standardFileManager);            StringObject stringObject = new StringObject(new URI("Student.java"), JavaFileObject.Kind.SOURCE, classString);            JavaCompiler.CompilationTask task = compiler.getTask(null, classJavaFileManager, null, null, null,                    Arrays.asList(stringObject));            if (task.call()) {                ClassJavaFileObject javaFileObject = classJavaFileManager.getClassJavaFileObject();                ClassLoader classLoader = new MyClassLoader(javaFileObject);                Object student = classLoader.loadClass("Student").newInstance();                System.out.println("student-->"+student);//student对象                Method getStudetnId = student.getClass().getMethod("getStudentId");                Object invoke = getStudetnId.invoke(student);                System.out.println("getStudentId-->"+invoke);            }        }        /**    *自定义fileManager    */         static class ClassJavaFileManager extends ForwardingJavaFileManager{            private ClassJavaFileObject classJavaFileObject;            public ClassJavaFileManager(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));             }        }                  /**     * 存储源文件     */          static 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文件(不需要存到文件中)     */        static 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*/        static class MyClassLoader extends ClassLoader{             private ClassJavaFileObject stringObject;              public MyClassLoader(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 main(String[] args) throws Exception { createStudent(); } }

 

转载于:https://www.cnblogs.com/it-mh/p/10729921.html

你可能感兴趣的文章
设计模式-结构型模式,外观模式(6)
查看>>
[Java] 遍历HashMap和HashMap转换成List的两种方式
查看>>
mongodb
查看>>
LeetCode 46. Permutations
查看>>
jmeter- 性能测试3:聚合报告(Aggregate Report )
查看>>
JavaScript高级程序设计---学习笔记(二)
查看>>
vim 插件的学习
查看>>
Uncaught SyntaxError: Unexpected token ILLEGAL
查看>>
一个预处理定义的问题
查看>>
ANDROID L——Material Design综合应用(Demo)
查看>>
自我介绍以及关于软件工程的问题
查看>>
struts (一)
查看>>
【新番推荐】工作细胞
查看>>
NYOJ 16 矩形嵌套
查看>>
Leetcode中的SQL题目练习(二)
查看>>
dubbo 集群容错源码
查看>>
Collection接口的子接口——Queue接口
查看>>
LINUX安装NGINX
查看>>
服务器启动项目抛错 没有到主机的路由
查看>>
python_85_sys模块
查看>>