java 实现 javascript eval 函数


具体实现

MyClassLoader.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import java.util.Arrays;
import javax.tools.SimpleJavaFileObject;
import javax.tools.JavaFileObject;
import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;
import javax.tools.DiagnosticCollector;
import java.net.URI;



* @version 1.0
*/

public class
extends ClassLoader
{

public Class<?> findClass(String str) throws ClassNotFoundException
{
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
//用于诊断源代码编译错误的对象
DiagnosticCollector diagnostics = new DiagnosticCollector();
//内存中的源代码保存在一个从JavaFileObject继承的类中
JavaFileObject file = new JavaSourceFromString("Temp", str.toString());
Iterable compilationUnits = Arrays.asList(file);
//建立一个编译任务
JavaCompiler.CompilationTask task = compiler.getTask(null, null, null, null, null, compilationUnits);
//编译源程序
boolean result = task.call();
if (result)
{
return Class.forName("Temp");
}
return null;
}
}

class JavaSourceFromString extends SimpleJavaFileObject
{
private String name;
private String code;
public JavaSourceFromString(String name, String code)
{
super(URI.create("string:///" + name.replace('.', '/') + Kind.SOURCE.extension), Kind.SOURCE);
this.code = code;
}

public CharSequence getCharContent(boolean ignoreEncodingErrors)
{
return code;
}
}

Eval.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 import java.lang.reflect.Method;  

/**
* @version 1.0
*/

public class Eval
{
public static Object eval(String str) throws Exception
{
StringBuffer sb = new StringBuffer();
sb.append("public class Temp");
sb.append("{");
sb.append(" public Object getObject()");
sb.append(" {");
sb.append(" " + str + "return new Object();");
sb.append(" }");
sb.append("}");
//调用自定义类加载器加载编译在内存中class文件
Class clazz = new MyClassLoader().findClass(sb.toString());
Method method = clazz.getMethod("getObject");
//通过反射调用方法
return method.invoke(clazz.newInstance());
}

public static void main(String[] args) throws Exception
{
Object rval = eval("System.out.println(/"Hello World/");");
System.out.println(rval);
}
}