原文:https://blog.csdn.net/zhao_xinhu/article/details/82499062#commentsedit

参考:https://www.cnblogs.com/xinruyi/p/9413007.html

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 = "public class Student{ "
+ " private String studentId; "
+ " public String getStudentId(){ "
+ " return studentId; "
+ " } "
+ " public void setStudentId(String studentId){ "
+ " this.studentId = studentId; "
+ " } "
+ "} "; 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 setStudentId = student.getClass().getMethod("setStudentId",String.class);//获取set方法
Object obj1 = setStudentId.invoke(student, "tom");//使用对象赋值
System.out.println("-->setStudentId-->"+setStudentId.toString()+"-->"+obj1);
Method getStudentId = student.getClass().getMethod("getStudentId");//获取get方法
Object obj2 = getStudentId.invoke(student);//使用对象取值
System.out.println("-->getStudentId-->"+getStudentId.toString()+"-->"+obj2); }
} /** *自定义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;
}
//使JavaCompiler可以从content获取java源码
@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;
}
//获取输出流为byte[]数组
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();
} }

今天听到一个给属性赋值的方法比invoke效率高,记录一下

//			java.lang.reflect.Field name = clazz.getField("name");//不能访问私有,getField用于返回一个指定名称的属性,但是这个属性必须是公有的
// name.set(obj, "tom");//set方法不能给私有属性赋值 java.lang.reflect.Field name = clazz.getDeclaredField("name");//getDeclaredField方法可以得到私有属性
name.setAccessible(true);//若想使用set方法给属性赋值,需要设置accessible为true
name.set(obj, "tom");

  

Java——动态创建Class(不写入文件,直接从内存中创建class)的更多相关文章

  1. In-Memory:在内存中创建临时表和表变量

    在Disk-Base数据库中,由于临时表和表变量的数据存储在tempdb中,如果系统频繁地创建和更新临时表和表变量,大量的IO操作集中在tempdb中,tempdb很可能成为系统性能的瓶颈.在SQL ...

  2. 用ASP创建API。NET Core (Day2):在ASP中创建API。网络核心

    下载PDF article - 1.5 MB 下载source - 152.4 KB 下载source - 206.3 KB 下载source code from GitHub 表的内容 中间件路线图 ...

  3. Java语言中:float、double数据类型在内存中是如何存储的

    引用参考 https://www.cnblogs.com/chenmingjun/p/8415464.html#4291528 https://blog.csdn.net/yansmile1/arti ...

  4. java关于StringBuffer和StringBuilder写入文件的效率问题

    StringBuffer在存储字符的时候,是有上限的,一旦达到上线就会出错,自己在项目中遇到一个从数据库中查询数据,然后写入到本地文件中 ,数据量大概有30万条,此时的效率十分的低.下面是大致的模拟该 ...

  5. 使用java NIO及高速缓冲区写入文件

    byte[] bytes = Files.readAllBytes(Paths.get("E:\\pdf\\aaa\\html\\text.txt").normalize()); ...

  6. php对象在内存中创建于释放

    <?php /** * 1.对象的创建占用内存, * 对象内存释放,析构方法就是在对象释放前运行最后的一步.可以自动释放和手动释放 * 手动释放:通过unset($p);来释放对象,在这个时候会 ...

  7. c#内存中创建反射

    代码 IWFP_SYS_Bytes mywfpbyte; /**/ byte[] bin=null; using (FileStream fs = new FileStream(filename, F ...

  8. java中的各种数据类型在内存中存储的方式

    原文地址:http://blog.csdn.net/aaa1117a8w5s6d/article/details/8251456 1.Java是如何管理内存的 java的内存管理就是对象的分配和释放问 ...

  9. Java的各类型数据在内存中分配情况详解

    1.      有这样一种说法,如今争锋于IT战场的两大势力,MS一族偏重于底层实现,Java一族偏重于系统架构.说法根据无从考证,但从两大势力各自的社区力量和图书市场已有佳作不难看出,此说法不虚,但 ...

随机推荐

  1. 从零搭建Prometheus监控报警系统

    什么是Prometheus? Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB).Prometheus使用Go语言开发,是Google BorgMon监控系统 ...

  2. 数据结构--栈(附上STL栈)

    定义: 栈是一种只能在某一端插入和删除数据的特殊线性表.他按照先进先出的原则存储数据,先进的数据被压入栈底,最后进入的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后被压入栈的,最先弹出).因此栈 ...

  3. USB设备驱动模型

    嵌入式设备驱动的编写,基本上都要按照一定的驱动模型编写.不这么做的话,一旦设备发生了更新和改变,大部分的驱动代码都要推倒重来,代码的重用率低,不具备移植性.所以在新版linux2.6.22以后的内核版 ...

  4. unittest(生成 HTMLTestRunner 模块)

    一:生成 HTMLTestRunner 模块 unittest 里面是不能生成 html 格式报告的,需要导入一个第三方的模块:HTMLTestRunner 方法1.这个模块下载不能通过 pip 安装 ...

  5. Centos7 搭建bind9.9

    DNS服务器概述: DNS(Domain Name System),即域名系统. DNS服务器分为三种: 主域名服务器(Master Server).辅助域名服务器(Slave DNS).缓存服务器( ...

  6. 9) drf JWT 认证 签发与校验token 多方式登陆 自定义认证规则反爬 admin密文显示

    一 .认证方法比较 1.认证规则图 django 前后端不分离 csrf认证 drf 前后端分离 禁用csrf 2. 认证规则演变图 数据库session认证:低效 缓存认证:高效 jwt认证:高效 ...

  7. startUML简单使用教程

    最近在startUML上画图搞得我一个头两个大,找了一些比较实用的小方法分享给大家. 类图是可视化地表现类的属性和方法,以及类与类之间的关系. 1.类 a.类 普通实体类,它有对应的属性和方法: 双击 ...

  8. windows远程执行命令总结

    1. 利用Impacket Impacket是一个Python类库,用于对SMB1-3或IPv4 / IPv6 上的TCP.UDP.ICMP.IGMP,ARP,IPv4,IPv6,SMB,MSRPC, ...

  9. thinkphp历史漏洞

    https://github.com/pochubs/pochubs/blob/master/ThinkPHP.md tp 历史漏洞 路由控制類RCE/think/App.php if (!preg_ ...

  10. 用Navicat建MySQL数据库表,动态改变创建时间和更新时间戳

    1.create_time 记录创建的时间,设默认值为:CURRENT_TIMESATMP 注意:不勾选那个[根据当前时间戳更新] 2.operator_time 更新记录的时间,勾选那个[根据当前时 ...