简单java程序在线测评程序
一.前言
大家过年好!今年的第一篇博客啊!家里没有网,到处蹭无线!日子过得真纠结!因为毕设的需求,简单写了一个java程序在线测评程序,当然也可以在本地测试。
二.思路
首先简单介绍一下思路:
1.得到java程序的源代码,不需要导入包。得到源码之后在前面加入”import java.util.*;”
2.通过JavaCompiler对象可以帮助我们将java源代码编译成class文件。
3.通过DiagnosticCollector对象可以获得编译过程中产生的编译信息。
4.通过StandardJavaFileManager对象管理生成的class文件,例如文件的存放位置。
5.StringSourceJavaObject对象可以对java源码进行包装并处理。
数据是控制台输入的,所以要重定向System.in(注意保存标准的输入流);另外程序的输出是到标准的输出流的,为了获得输出结果,我的方法是重定向输出流到ByteArrayOutputStream,然后利用ByteArrayOutputStream构造BufferedReader。
6.运行程序,通过java的反射机制,获得main函数的Method对象。
7.运行时间的计算:通过System.currentTimeMillis()方法。
8.程序所需内存:通过Runtime的freeMemory()方法。
9.异常信息的获取:StringWriter sw = new StringWriter(); e.printStackTrace(new PrintWriter(sw, true)); sw.toString();
三.问题解决
1. JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 出现NullPointerException。
查看部分源码如下:
private static final String[] defaultToolsLocation = { "lib", "tools.jar"};private Class>findSystemToolClass(String toolClassName)throwsMalformedURLException, ClassNotFoundException {//try loading class directly, in case tool is on the bootclasspath
try{return Class.forName(toolClassName, false, null);
}catch(ClassNotFoundException e) {
trace(FINE, e);//if tool not on bootclasspath, look in default tools location (tools.jar)
ClassLoader cl = (refToolClassLoader == null ? null: refToolClassLoader.get());if (cl == null) {
File file= new File(System.getProperty("java.home"));if (file.getName().equalsIgnoreCase("jre"))
file=file.getParentFile();for(String name : defaultToolsLocation)
file= newFile(file, name);//if tools not found, no point in trying a URLClassLoader//so rethrow the original exception.
if (!file.exists())throwe;
URL[] urls={ file.toURI().toURL() };
trace(FINE, urls[0].toString());
cl=URLClassLoader.newInstance(urls);
refToolClassLoader= new WeakReference(cl);
}return Class.forName(toolClassName, false, cl);
}
}
打印 System.out.println(System.getProperty("java.home"));如下:
C:\Program Files (x86)\Java\jre6
defaultToolsLocation = { "lib", "tools.jar" }; 也就是最终到
C:\Program Files (x86)\Java\jre6\lib\tools.jar中寻找tools.jar
然而jre6\lib中没有tools.jar,而是在C:\Program Files (x86)\Ja