• JAVA动态编译(JavaCompiler)


    一、简介

    在java中javax报下提供了JavaCompiler类,此类可以允许开发人员编译java文件为class文件。

    下面示例中是利用JavaCompiler编译文件,并利用URLClassLoader加载编译好的class文件执行其中的方法。

    二、示例代码

    package com.test.cp;
    import java.io.File;
    import java.io.FileWriter;
    import java.lang.reflect.Method;
    import java.net.URL;
    import java.net.URLClassLoader;
    import javax.tools.JavaCompiler;
    import javax.tools.JavaCompiler.CompilationTask;
    import javax.tools.JavaFileObject;
    import javax.tools.StandardJavaFileManager;
    import javax.tools.ToolProvider;
    public class CompilerMain {
    	public static void main(String[] args) throws Exception {
    		testCompiler();
    	}
    	public static void testCompiler() throws Exception {
    		String currentDir = System.getProperty("user.dir");
    		// 將源码写入文件中
    		String src = "package com.test.cp;"
    				+ "public class TestCompiler {"
    				+ "	public void disply() {"
    				+ "	System.out.println("Hello");"
    				+ "}}";
    		String filename = currentDir + "/src/com/test/cp/TestCompiler.java";
    		File file = new File(filename);
    		FileWriter fw = new FileWriter(file);
    		fw.write(src);
    		fw.flush();
    		fw.close();
    		// 使用JavaCompiler 编译java文件
    		JavaCompiler jc = ToolProvider.getSystemJavaCompiler();
    		StandardJavaFileManager fileManager = jc.getStandardFileManager(null, null, null);
    		Iterable<? extends JavaFileObject> fileObjects = fileManager.getJavaFileObjects(filename);
    		CompilationTask cTask = jc.getTask(null, fileManager, null, null, null, fileObjects);
    		cTask.call();
    		fileManager.close();
    		// 使用URLClassLoader加载class到内存
    		URL[] urls = new URL[] { new URL("file:/" + currentDir + "/src/") };
    		URLClassLoader cLoader = new URLClassLoader(urls);
    		Class<?> c = cLoader.loadClass("com.test.cp.TestCompiler");
    		cLoader.close();
    		// 利用class创建实例,反射执行方法
    		Object obj = c.newInstance();
    		Method method = c.getMethod("disply");
    		method.invoke(obj);
    	}
    }


  • 相关阅读:
    Python基础----内置函数补充、匿名函数、递归函数
    为arm-linux开发板挂载基于nfs的根文件系统
    vsftp上传553 Could not create file错误解决
    在itop4412移植linux4.14和设备树遇到的问题及解决
    itop4412uboot中支持usbhub
    上下界网络流
    lca(最近公共祖先(在线)) 倍增法详解
    lca(最近公共祖先(离线))
    最小费用最大流
    spfa模板+讲解
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3424006.html
Copyright © 2020-2023  润新知