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();
}
}