最近在研究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[]{});