• Java——动态生成POJO类


    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();
            }
            
    }
  • 相关阅读:
    UIButton中setTitleEdgeInsets和setImageEdgeInsets的使用
    关于自定义导航条UIBarButtonItem偏移的问题
    iOS端使用二维码扫描(ZBarSDK)和生成(libqrencode)功能
    CocoaPods安装和使用教程
    IOS中NSUserDefaults的用法(轻量级本地数据存储) (转)
    UIPickerView简单选择器的基本使用
    [原]Unity手游之路&lt;三&gt; 基于Unity+Java的聊天室源码
    [原]UML建模语言进阶
    [原]Java多线程编程学习笔记之九:使用wait/notify/notifyAll实现线程间通信的几点说明
    [原]MySQL的表分区
  • 原文地址:https://www.cnblogs.com/it-mh/p/10729921.html
Copyright © 2020-2023  润新知