Java动态编译

最近在研究Java动态编译的内容,主要就是看InfoQ上的Java深度历险,但是我在我的Eclipse下去尝试那些作者的代码并不是很顺利

		StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
程序在运行到这里的时候发生了Exception为

Exception in thread "main" java.lang.NullPointerException
	at com.vortex.test.Calculator.calculate(Calculator.java:48)
	at com.vortex.test.Calculator.main(Calculator.java:93)
空指针的异常,查看了一些资料,主要因为我们的jre环境不对,在Eclipse下应该在window->preferences->java->instanlled jres 下选择为jdk 中的jre例如C:\Program Files\Java\jdk1.6.0_21\jre

那么就可以运行正常了。

Eclipse 编译过后的class文件是存储在bin目录下的,我们如果想让动态编译过的类也在bin目录下要增加编译的参数

		Iterable<String> options = Arrays.asList("-d", ".\\bin");
		CompilationTask task = compiler.getTask(null, fileManager, null, options, null, fileObjects);
如何加载并且运行刚刚编译过的类呢?

				// 采用两种方式都是可以的
//				Class<?> clazz = Class.forName("com.vortex.test." + className);
				Class<?> clazz = loader.loadClass("com.vortex.test." + className);
				Object obj = clazz.newInstance();
				Method method = clazz.getMethod(methodName, new Class[]{});
				Object value = method.invoke(obj, new Object[]{});


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 提供了动态编译的功能,可以在程序运行时动态编译 Java 代码。动态编译需要使用 Java Compiler API,该 API 可以编译字符串形式的 Java 代码,生成对应的 class 文件。下面是一个简单的示例: ```java import javax.tools.*; import java.io.*; import java.util.*; public class DynamicCompilation { public static void main(String[] args) throws Exception { // 定义需要编译Java 代码 String code = "public class HelloWorld {\n" + " public static void main(String[] args) {\n" + " System.out.println(\"Hello, world!\");\n" + " }\n" + "}"; // 获取 Java 编译JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); // 定义编译任务 JavaFileObject file = new JavaSourceFromString("HelloWorld", code); Iterable<? extends JavaFileObject> compilationUnits = Arrays.asList(file); // 定义编译参数 List<String> options = new ArrayList<>(); options.addAll(Arrays.asList("-classpath", System.getProperty("java.class.path"))); // 执行编译任务 DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>(); StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null); JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, diagnostics, options, null, compilationUnits); boolean success = task.call(); // 输出编译结果 for (Diagnostic<? extends JavaFileObject> diagnostic : diagnostics.getDiagnostics()) { System.out.println(diagnostic.getMessage(null)); } fileManager.close(); if (success) { // 加载编译生成的 class 文件 Class<?> clazz = Class.forName("HelloWorld"); // 执行 class 的 main 方法 clazz.getDeclaredMethod("main", String[].class).invoke(null, (Object)args); } } // 定义一个 JavaFileObject 的实现类,用于编译 Java 代码 static class JavaSourceFromString extends SimpleJavaFileObject { private final String code; JavaSourceFromString(String name, String code) { super(URI.create("string:///" + name.replace('.', '/') + Kind.SOURCE.extension), Kind.SOURCE); this.code = code; } @Override public CharSequence getCharContent(boolean ignoreEncodingErrors) { return code; } } } ``` 上面的代码定义了一个需要编译Java 代码,并使用 Java Compiler API 编译生成了对应的 class 文件。你可以根据自己的需求修改代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值