zoukankan      html  css  js  c++  java
  • 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);
    	}
    }


  • 相关阅读:
    启动 Appium 自带模拟器
    Android的一些常用命令提示符(cmd)指令
    Eclipse中没有andriod问题解决方法
    selenium键盘操作
    鼠标事件
    appium运行from appium import webdriver 提示most recent call last
    appium for windows 环境搭建
    python+Eclipse+pydev环境搭建
    nmon和nmon analyser的下载和使用
    Linux下使用NMON监控、分析系统性能
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3424006.html
Copyright © 2011-2022 走看看