forked from SunnyLive/JavaEval
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathEval.java
More file actions
109 lines (84 loc) · 3.2 KB
/
Copy pathEval.java
File metadata and controls
109 lines (84 loc) · 3.2 KB
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package com.dev.java.run;
import javax.tools.*;
import java.io.File;
import java.lang.ref.WeakReference;
import java.lang.reflect.Method;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;
public class Eval {
private static WeakReference<Eval> mWeakReference = new WeakReference<>(new Eval());
public static Object eval() {
Eval eval = mWeakReference.get();
String method = "main";
String codes = "public static void main(String[]args){" +
"System.out.print(\"hello world\"); }";
eval.run(method,codes);
return null;
}
public static void main(String[] args) {
eval();
}
private Object run(String method,String codes){
String className = "com.test.Eval";
StringBuilder sb = new StringBuilder();
sb.append("package com.test;");
sb.append("\n public class Eval{\n ");
sb.append(codes);
sb.append("\n}");
Class<?> clazz = compile(className, sb.toString());
try {
// 生成对象
Object obj = clazz.newInstance();
Class<? extends Object> cls = obj.getClass();
// 调用sayHello方法
Method m = clazz.getMethod(method,String[].class);
Object invoke = m.invoke(obj, new Object[] { new String[] {} });
return invoke;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 装载字符串成为java可执行文件
* @param className className
* @param javaCodes javaCodes
* @return Class
*/
private Class<?> compile(String className, String javaCodes) {
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
StrSrcJavaObject srcObject = new StrSrcJavaObject(className, javaCodes);
Iterable<? extends JavaFileObject> fileObjects = Arrays.asList(srcObject);
String flag = "-d";
String outDir = "";
try {
File classPath = new File(Thread.currentThread().getContextClassLoader().getResource("").toURI());
outDir = classPath.getAbsolutePath() + File.separator;
} catch (URISyntaxException e1) {
e1.printStackTrace();
}
Iterable<String> options = Arrays.asList(flag, outDir);
JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, null, options, null, fileObjects);
boolean result = task.call();
if (result == true) {
try {
return Class.forName(className);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
return null;
}
private static class StrSrcJavaObject extends SimpleJavaFileObject {
private String content;
StrSrcJavaObject(String name, String content) {
super(URI.create("string:///" + name.replace('.', '/') + Kind.SOURCE.extension), Kind.SOURCE);
this.content = content;
}
public CharSequence getCharContent(boolean ignoreEncodingErrors) {
return content;
}
}
}