java pojo生成_Java——动态生成POJO类

packagecom.java.test.dynamicpojo;importjava.io.ByteArrayOutputStream;importjava.io.IOException;importjava.io.OutputStream;importjava.lang.reflect.Method;importjava.net.URI;importjava.util.Arrays;importjavax.tools.FileObject;importjavax.tools.ForwardingJavaFileManager;importjavax.tools.JavaCompiler;importjavax.tools.JavaFileManager;importjavax.tools.JavaFileObject;importjavax.tools.SimpleJavaFileObject;importjavax.tools.StandardJavaFileManager;importjavax.tools.ToolProvider;public classDynamicPOJO {private static String classString = "/* hehha */" + "public class Student{ "

+ " private String studentId; "

+ " public String getStudentId(){ "

+ " return \"小明\"; "

+ " } "

+ "} ";private static void createStudent() throwsException {

JavaCompiler compiler=ToolProvider.getSystemJavaCompiler();

StandardJavaFileManager standardFileManager= compiler.getStandardFileManager(null, null, null);

ClassJavaFileManager classJavaFileManager= newClassJavaFileManager(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= newMyClassLoader(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 extendsForwardingJavaFileManager{privateClassJavaFileObject classJavaFileObject;publicClassJavaFileManager(JavaFileManager fileManager) {super(fileManager);

}publicClassJavaFileObject getClassJavaFileObject() {returnclassJavaFileObject;

}/**这个方法一定要自定义*/@OverridepublicJavaFileObject getJavaFileForOutput(Location location, String className,

JavaFileObject.Kind kind, FileObject sibling)throwsIOException {return (classJavaFileObject = newClassJavaFileObject(className,kind));

}

}/*** 存储源文件*/

static class StringObject extendsSimpleJavaFileObject{privateString content;publicStringObject(URI uri, Kind kind, String content) {super(uri, kind);this.content =content;

}

@Overridepublic CharSequence getCharContent(boolean ignoreEncodingErrors) throwsIOException {return this.content;

}

}/*** class文件(不需要存到文件中)*/

static class ClassJavaFileObject extendsSimpleJavaFileObject{

ByteArrayOutputStream outputStream;publicClassJavaFileObject(String className, Kind kind) {super(URI.create(className +kind.extension), kind);this.outputStream = newByteArrayOutputStream();

}//这个也要实现

@Overridepublic OutputStream openOutputStream() throwsIOException {return this.outputStream;

}public byte[] getBytes(){return this.outputStream.toByteArray();

}

}/**自定义classloader*/

static class MyClassLoader extendsClassLoader{privateClassJavaFileObject stringObject;publicMyClassLoader(ClassJavaFileObject stringObject){this.stringObject =stringObject;

}

@Overrideprotected Class> findClass(String name) throwsClassNotFoundException {byte[] bytes = this.stringObject.getBytes();return defineClass(name,bytes,0,bytes.length);

}

}public static void main(String[] args) throwsException {

createStudent();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值