栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

java如何动态编译和加载外部Java类?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java如何动态编译和加载外部Java类?

以下内容基于JavaDocs中给出的示例

这会将

a
保存
File
testcompile
目录中(基于
package
名称要求),然后将其编译
File
为Java类。

package inlinecompiler;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.io.Writer;import java.net.URL;import java.net.URLClassLoader;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import javax.tools.Diagnostic;import javax.tools.DiagnosticCollector;import javax.tools.JavaCompiler;import javax.tools.JavaFileObject;import javax.tools.StandardJavaFileManager;import javax.tools.ToolProvider;public class InlineCompiler {    public static void main(String[] args) {        StringBuilder sb = new StringBuilder(64);        sb.append("package testcompile;n");        sb.append("public class HelloWorld implements inlinecompiler.InlineCompiler.DoStuff {n");        sb.append("    public void doStuff() {n");        sb.append("        System.out.println("Hello world");n");        sb.append("    }n");        sb.append("}n");        File helloWorldJava = new File("testcompile/HelloWorld.java");        if (helloWorldJava.getParentFile().exists() || helloWorldJava.getParentFile().mkdirs()) { try {     Writer writer = null;     try {         writer = new FileWriter(helloWorldJava);         writer.write(sb.toString());         writer.flush();     } finally {         try {  writer.close();         } catch (Exception e) {         }     }          DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();     JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();     StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null);     // This sets up the class path that the compiler will use.     // I've added the .jar file that contains the DoStuff interface within in it...     List<String> optionList = new ArrayList<String>();     optionList.add("-classpath");     optionList.add(System.getProperty("java.class.path") + File.pathSeparator + "dist/InlineCompiler.jar");     Iterable<? extends JavaFileObject> compilationUnit  = fileManager.getJavaFileObjectsFromFiles(Arrays.asList(helloWorldJava));     JavaCompiler.CompilationTask task = compiler.getTask(         null,          fileManager,          diagnostics,          optionList,          null,          compilationUnit);          if (task.call()) {                  System.out.println("Yipe");         // Create a new custom class loader, pointing to the directory that contains the compiled         // classes, this should point to the top of the package structure!         URLClassLoader classLoader = new URLClassLoader(new URL[]{new File("./").toURI().toURL()});         // Load the class from the classloader by name....         Class<?> loadedClass = classLoader.loadClass("testcompile.HelloWorld");         // Create a new instance...         Object obj = loadedClass.newInstance();         // Santity check         if (obj instanceof DoStuff) {  // Cast to the DoStuff interface  DoStuff stuffToDo = (DoStuff)obj;  // Run it baby  stuffToDo.doStuff();         }              } else {         for (Diagnostic<? extends JavaFileObject> diagnostic : diagnostics.getDiagnostics()) {  System.out.format("Error on line %d in %s%n",          diagnostic.getLineNumber(),          diagnostic.getSource().toUri());         }     }     fileManager.close(); } catch (IOException | ClassNotFoundException | InstantiationException | IllegalAccessException exp) {     exp.printStackTrace(); }        }    }    public static interface DoStuff {        public void doStuff();    }}

现在已更新,包括为编译器提供类路径以及已编译类的加载和执行!



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/407659.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号