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();
} }
Java——动态生成POJO类的更多相关文章
- java web(七): mybatis的动态sql和mybatis generator自动生成pojo类和映射文件
前言: MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据 不同条件拼接 SQL 语句的痛苦.例如拼接时要确保不能忘记添加必要的空格,还 ...
- Java基础---Java---基础加强---类加载器、委托机制、AOP、 动态代理技术、让动态生成的类成为目标类的代理、实现Spring可配置的AOP框架
类加载器 Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader,AppClassLoader 类加载器也是Jav ...
- Java动态生成类以及动态添加属性
有个技术实现需求:动态生成类,其中类中的属性来自参数对象中的全部属性以及来自参数对象properties文件. 那么技术实现支持:使用CGLib代理. 具体的实现步骤: 1.配置Maven文件: &l ...
- JAVA基础加强(张孝祥)_类加载器、分析代理类的作用与原理及AOP概念、分析JVM动态生成的类、实现类似Spring的可配置的AOP框架
1.类加载器 ·简要介绍什么是类加载器,和类加载器的作用 ·Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader ...
- Java 动态生成 PDF 文件
每片文章前来首小诗: 今日夕阳伴薄雾,印着雪墙笑开颜.我心仿佛出窗前,浮在半腰望西天. --泥沙砖瓦浆木匠 需求: 项目里面有需要java动态生成 PDF 文件,提供下载.今天我找了下有关了,系 ...
- 利用Java动态生成 PDF 文档
利用Java动态生成 PDF 文档,则需要开源的API.首先我们先想象需求,在企业应用中,客户会提出一些复杂的需求,比如会针对具体的业务,构建比较典型的具备文档性质的内容,一般会导出PDF进行存档.那 ...
- Java 动态生成复杂 Word
Java 动态生成复杂 Word 阅读目录 1. 制作 Word 模版,将你需要动态生成的字段用${}替换.2. 将 Word文档保存为 xml .3. 引入项目. 项目中需要用 java 程序生成d ...
- 根据数据库记录动态生成C#类及其公共属性并动态执行的解决方案
原文:根据数据库记录动态生成C#类及其公共属性并动态执行的解决方案 问题: C#中,想动态产生这么一个类: public class StatisticsData { public ...
- java动态生成HTML文件
在eclipse中,用java动态生成html文件. //用于存储html字符串 StringBuilder stringHtml = new StringBuilder(); try{ //打开文件 ...
随机推荐
- 4.shell基本操作简介
判断一个命令是不是内置命令,可以用type命令 1.printf :冒号 #:〉 test.txt 这里会建立一个空文件test.txt set -o|grep emacs 查看 emacs 模式是 ...
- 一句话总结JS构造函数、原型和实例的关系
"每个构造函数都有一个原型对象, 原型对象都包含一个指向构造函数的指针, 实例都包含一个指向原型对象的内部指针." --此段话摘自<JavaScript高级程序设计>. ...
- nodeJS生成xlsx以及设置样式
参考: https://www.npmjs.com/package/xlsx-style https://www.jianshu.com/p/877631e7e411 https://sheetjs. ...
- HDOJ 4699 Editor 对顶栈模拟
Editor Time Limit: 3000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Subm ...
- 【Elasticsearch学习】之基础概念
Elasticsearch是一个近实时的分布式搜索引起,其底层基于开源全文搜索库Lucene:Elasticsearch对Lucene进行分装,对外提供REST API 的操作接口.基于 ES,可以快 ...
- Mybatis时间范围查询,亲测有效
Md2All export document .output_wrapper pre code{font-family: Consolas, Inconsolata, Courier, monospa ...
- 怎么成为一名WEB前端开发工程师
对于刚开始学的人来说,web 就是HTML+CSS+JavaScript其实我们是可以这样理解的.web工程师负责或参与Web产品的页面开发,包含PC端.移动APP内嵌移动端.微信小程序.web ...
- D. Kefa and Dishes(状压)
永久打开的传送门 \(这次总算没有写砸........\) \(设f[i][j]为上一次吃的i物品状态为j的最大收益\) \(那么我们就暴力枚举所有状态i,然后在当前状态找出一个没吃的食物j,再去找一 ...
- 戴尔服务器ipmi报错
戴尔服务器ipmi配置完成,用浏览器打开报错 查看器已终止,网络已中断 原因:这个问题是java报错,用火狐打开报错 解决方法: 用IE打开就没问题,IE要用较高版本的,楼主的是win10-IE11
- Coursera课程笔记----计算导论与C语言基础----Week 4
感性认识计算机程序(Week 4) 引入 编程序 = 给计算机设计好运行步骤 程序 = 人们用来告诉计算机应该做什么的东西 问题➡️该告诉计算机什么?用什么形式告诉? 如果要创造一门"程序设 ...