Skip to content

Commit bb85a30

Browse files
author
“threedr3am”
committed
add:添加点奇怪的东西
1 parent 1e98f58 commit bb85a30

File tree

2 files changed

+100
-2
lines changed

2 files changed

+100
-2
lines changed

java-compile/src/main/java/com/threedr3am/bug/compile/javac/CustomJavaFileObject.java

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package com.threedr3am.bug.compile.javac;
22

33
import java.io.IOException;
4+
import java.net.MalformedURLException;
45
import java.net.URI;
56
import java.net.URISyntaxException;
7+
import java.net.URL;
8+
import java.net.URLClassLoader;
69
import java.nio.charset.Charset;
710
import java.util.Arrays;
811
import java.util.List;
@@ -11,9 +14,11 @@
1114
import javax.tools.DiagnosticCollector;
1215
import javax.tools.JavaCompiler;
1316
import javax.tools.JavaCompiler.CompilationTask;
17+
import javax.tools.JavaFileManager.Location;
1418
import javax.tools.JavaFileObject;
1519
import javax.tools.SimpleJavaFileObject;
1620
import javax.tools.StandardJavaFileManager;
21+
import javax.tools.StandardLocation;
1722
import javax.tools.ToolProvider;
1823

1924
/**
@@ -29,14 +34,21 @@ public static void e() throws URISyntaxException {
2934
StandardJavaFileManager standardJavaFileManager = javaCompiler
3035
.getStandardFileManager(diagnostics, Locale.CHINA, Charset.forName("utf-8"));
3136
// FileManagerImpl fileManager = new FileManagerImpl(standardJavaFileManager);
37+
// StringBuilder stringBuilder = new StringBuilder()
38+
// .append("class Main {")
39+
// .append(" public static void main(String[] args) {")
40+
// .append(" System.out.println(\"hello FFF!\");")
41+
// .append(" }")
42+
// .append("}");
3243
StringBuilder stringBuilder = new StringBuilder()
3344
.append("class Main {")
34-
.append(" public static void main(String[] args) {")
45+
.append(" static {")
3546
.append(" System.out.println(\"hello FFF!\");")
3647
.append(" }")
3748
.append("}");
49+
JavaFileObject javaFileObject = new JavaObjectFromString("tmp.Main", stringBuilder.toString());
3850
Iterable<? extends JavaFileObject> javaFileObjects = Arrays
39-
.asList(new JavaObjectFromString("Main", stringBuilder.toString()));
51+
.asList(javaFileObject);
4052

4153
// 编译任务
4254
CompilationTask task = javaCompiler.getTask(null, standardJavaFileManager, diagnostics, null, null, javaFileObjects);
@@ -47,6 +59,14 @@ public static void e() throws URISyntaxException {
4759
Diagnostic d = (Diagnostic) object;
4860
System.out.println(d.getMessage(Locale.ENGLISH));
4961
}
62+
63+
try {
64+
new URLClassLoader(new URL[]{javaFileObject.toUri().toURL()}).loadClass("Main");
65+
} catch (ClassNotFoundException e) {
66+
e.printStackTrace();
67+
} catch (MalformedURLException e) {
68+
e.printStackTrace();
69+
}
5070
}
5171

5272
public static void main(String[] args) throws URISyntaxException {
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package com.threedr3am.bug.compile.javac;
2+
3+
import java.io.IOException;
4+
import java.lang.reflect.Field;
5+
import java.net.MalformedURLException;
6+
import java.net.URI;
7+
import java.net.URISyntaxException;
8+
import java.net.URL;
9+
import java.net.URLClassLoader;
10+
import java.nio.charset.Charset;
11+
import java.nio.file.Files;
12+
import java.nio.file.Paths;
13+
import java.util.Arrays;
14+
import java.util.List;
15+
import java.util.Locale;
16+
import java.util.Map;
17+
import java.util.Random;
18+
import javax.tools.Diagnostic;
19+
import javax.tools.DiagnosticCollector;
20+
import javax.tools.JavaCompiler;
21+
import javax.tools.JavaCompiler.CompilationTask;
22+
import javax.tools.JavaFileObject;
23+
import javax.tools.SimpleJavaFileObject;
24+
import javax.tools.StandardJavaFileManager;
25+
import javax.tools.ToolProvider;
26+
27+
/**
28+
* @author threedr3am
29+
*/
30+
public class RuntimeMakeClass {
31+
32+
//使用了自定义JavaFileObject实现的动态编译
33+
public void e() throws IOException {
34+
JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
35+
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector();
36+
StandardJavaFileManager standardJavaFileManager = javaCompiler
37+
.getStandardFileManager(diagnostics, Locale.CHINA, Charset.forName("utf-8"));
38+
int id = new Random().nextInt(10000000);
39+
StringBuilder stringBuilder = new StringBuilder()
40+
.append("import java.io.BufferedReader;\n")
41+
.append("import java.io.IOException;\n")
42+
.append("import java.io.InputStream;\n")
43+
.append("import java.io.InputStreamReader;\n")
44+
.append("public class Threedr3am" + id + " {\n")
45+
.append(" public static String result = \"\";\n")
46+
.append(" static {\n")
47+
.append(" try {")
48+
.append(" StringBuilder stringBuilder = new StringBuilder();\n")
49+
.append(" BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec(\"" + "ls" + "\").getInputStream()));\n")
50+
.append(" String line;\n")
51+
.append(" while((line = bufferedReader.readLine()) != null) {\n")
52+
.append(" stringBuilder.append(line).append(\"\\n\");\n")
53+
.append(" }\n")
54+
.append(" result = stringBuilder.toString();\n")
55+
.append(" } catch (Exception e) {\n")
56+
.append(" e.printStackTrace();\n")
57+
.append(" }\n")
58+
.append(" }\n")
59+
.append("}");
60+
String classPath = "/tmp/";
61+
Files.write(Paths.get(classPath + "Threedr3am" +id + ".java"), stringBuilder.toString().getBytes());
62+
Iterable fileObject = standardJavaFileManager.getJavaFileObjects(classPath + "Threedr3am" +id + ".java");
63+
javaCompiler.getTask(null, standardJavaFileManager, diagnostics, null, null, fileObject).call();
64+
try {
65+
System.out.println(new URLClassLoader(new URL[]{new URL("file:" + classPath)}).loadClass("Threedr3am" + id).getField("result").get(null));
66+
} catch (ClassNotFoundException e) {
67+
e.printStackTrace();
68+
} catch (NoSuchFieldException e) {
69+
e.printStackTrace();
70+
} catch (IllegalAccessException e) {
71+
e.printStackTrace();
72+
}
73+
}
74+
75+
public static void main(String[] args) throws IOException {
76+
new RuntimeMakeClass().e();
77+
}
78+
}

0 commit comments

Comments
 (0)