一、图示:
二、代码演示
package com.hy; import java.io.BufferedReader; import java.io.FileReader; import java.io.FileWriter; import java.lang.reflect.Constructor; import java.net.URL; import java.net.URLClassLoader; import javax.tools.JavaCompiler; import javax.tools.JavaCompiler.CompilationTask; import javax.tools.StandardJavaFileManager; import javax.tools.ToolProvider; import org.junit.Test; /** * * @author Administrator * */ public class Test1 { @Test public void test1() { try { //把一个文本读入内存 FileReader fr= new FileReader("C:\\Users\\Administrator\\Desktop\\News2.txt"); BufferedReader br = new BufferedReader(fr); String line = ""; StringBuilder sb = new StringBuilder(); while ((line = br.readLine()) != null) { sb.append(line); sb.append("\n"); } br.close(); fr.close(); //在某个路径下生成一个java文件 String path = System.getProperty("user.dir")+"\\src\\com\\hy\\News2.java"; FileWriter fw = new FileWriter(path); fw.write(sb.toString()); fw.flush(); fw.close(); //把类编译成class文件 JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();//获取java编译器 StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);//获取一个java文件管理器 Iterable iterable = fileManager.getJavaFileObjects(path);//生成一个特定的java文件对象 CompilationTask compilationTask = compiler.getTask(null, fileManager, null, null, null, iterable);//得到一个编译任务 compilationTask.call();//编译 fileManager.close(); //将class载入到内存里面 URL[] urls = new URL[]{new URL("file:/"+System.getProperty("user.dir")+"/src")};//加载这个路径下面的所有class(网络路径) URLClassLoader urlClassLoader = new URLClassLoader(urls); Class c = urlClassLoader.loadClass("com.hy.News2"); System.out.println(c); Constructor constructor = c.getConstructor();//获取构造方法 News2 news2 = (News2)constructor.newInstance();//使用构造方法得到一个实例 news2.sayHello();//调用方法 } catch (Exception e) { e.printStackTrace(); } } }
注意:这里演示通过代码文本动态生成一个java对象,使用动态编译!
时间: 2024-10-14 12:36:11