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

最新文章

  1. CentOS 6.2 Eclipse CDT 开发环境搭建
  2. Spring Boot下配置MyBatis多数据源
  3. 自发行python版本制作(一)
  4. 蛮考验基础的JS笔试题(有坑小心!)
  5. MySQL 5.6.26源码安装
  6. POJ1163 The Triangle: 倒三角形问题
  7. E: Write error - write (28 No space left on device)
  8. 快慢指针实现不依赖计数器寻找中位数(linked list)
  9. CSS学习之首页简单布局
  10. numpy模块中的sum(axis)方法
  11. window7下配置python2.7+tornado3.3开发环境
  12. 关于Net core 的https 设置小知识
  13. JavaScript对象(第四天)
  14. VS2013中编译openssl的步骤和使用设置
  15. 30、git 使用
  16. 【Golang 接口自动化06】微信支付md5签名计算及其优化
  17. Jmeter+JDK的安装学习笔记
  18. 07、在 Windows10 上获得屏幕分辨率
  19. 【51Nod 1238】最小公倍数之和 V3
  20. C++关联式容器的排序准则

热门文章

  1. vue中递归组件的使用
  2. js中的this指针的用法
  3. Git初始化本地代码及提交到服务器
  4. MySQL5.7中InnoDB不可不知的新特性
  5. python requests 接口测试
  6. startUML简单使用教程
  7. RDP凭据离线脱取
  8. 使用npm发布插件
  9. java基础篇 之 集合概述(List)
  10. 【FPGA篇章五】FPGA函数任务:对讲解函数与任务专题展开详解