java 内存中创建文件_Java——动态创建Class(不写入文件,直接从内存中创建class)...

该博客介绍了如何在Java中动态创建Class对象,无需将其写入文件。通过使用JavaCompiler,StandardJavaFileManager和自定义的JavaFileObject,可以在内存中生成并加载Student类。然后,展示了如何实例化这个类,调用其方法进行属性设置和获取。
摘要由CSDN通过智能技术生成

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 = "public class Student{ "

+ " private String studentId; "

+ " public String getStudentId(){ "

+ " return studentId; "

+ " } "

+ " public void setStudentId(String studentId){ "

+ " this.studentId = studentId; "

+ " } "

+ "} ";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 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 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;

}//使JavaCompiler可以从content获取java源码

@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;

}//获取输出流为byte[]数组

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、付费专栏及课程。

余额充值