Skip to content

Commit 9dff6f8

Browse files
author
“threedr3am”
committed
Merge branch 'java-compile'
# Conflicts: # pom.xml
2 parents 9951e8b + bb85a30 commit 9dff6f8

File tree

9 files changed

+523
-0
lines changed

9 files changed

+523
-0
lines changed

java-compile/pom.xml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<parent>
6+
<artifactId>learn-java-bug</artifactId>
7+
<groupId>com.xyh</groupId>
8+
<version>1.0-SNAPSHOT</version>
9+
</parent>
10+
<modelVersion>4.0.0</modelVersion>
11+
12+
<artifactId>java-compile</artifactId>
13+
14+
<dependencies>
15+
<dependency>
16+
<groupId>org.javassist</groupId>
17+
<artifactId>javassist</artifactId>
18+
<version>3.25.0-GA</version>
19+
<scope>compile</scope>
20+
</dependency>
21+
</dependencies>
22+
23+
</project>
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.threedr3am.bug.compile.javac;
2+
3+
import javax.tools.JavaCompiler;
4+
import javax.tools.ToolProvider;
5+
6+
/**
7+
* @author threedr3am
8+
*/
9+
public class ByJavaCompiler {
10+
11+
//直接使用JavaCompiler指定java文件编译
12+
public static void c() {
13+
JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
14+
int compilationResult = javaCompiler.run(null, null, null, "-cp", "/tmp/ccc/CCC.jar", "/tmp/Main.java");
15+
// 返回0表示编译成功
16+
if (compilationResult == 0) {
17+
System.out.println("success");
18+
} else {
19+
System.out.println("fail");
20+
}
21+
}
22+
23+
public static void main(String[] args) {
24+
c();
25+
}
26+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.threedr3am.bug.compile.javac;
2+
3+
import java.nio.charset.Charset;
4+
import java.util.List;
5+
import java.util.Locale;
6+
import javax.tools.Diagnostic;
7+
import javax.tools.DiagnosticCollector;
8+
import javax.tools.JavaCompiler;
9+
import javax.tools.JavaCompiler.CompilationTask;
10+
import javax.tools.JavaFileObject;
11+
import javax.tools.StandardJavaFileManager;
12+
import javax.tools.ToolProvider;
13+
14+
/**
15+
* @author threedr3am
16+
*/
17+
public class ByJavaFileObject {
18+
19+
//使用了JavaFileObject指定java文件进行编译
20+
public static void d() {
21+
JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
22+
ClassLoader classLoader = ByJavaFileObject.class.getClassLoader();
23+
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector();
24+
StandardJavaFileManager standardJavaFileManager = javaCompiler
25+
.getStandardFileManager(diagnostics, Locale.CHINA, Charset.forName("utf-8"));
26+
// FileManagerImpl fileManager = new FileManagerImpl(standardJavaFileManager);
27+
Iterable<? extends JavaFileObject> javaFileObjects = standardJavaFileManager.getJavaFileObjects("/tmp/ccc/CCC.java", "/tmp/Main.java");
28+
29+
// 编译任务
30+
CompilationTask task = javaCompiler.getTask(null, standardJavaFileManager, diagnostics, null, null, javaFileObjects);
31+
Boolean result = task.call();
32+
System.out.println(result);
33+
List list = diagnostics.getDiagnostics();
34+
for (Object object : list) {
35+
Diagnostic d = (Diagnostic) object;
36+
System.out.println(d.getMessage(Locale.ENGLISH));
37+
}
38+
}
39+
40+
public static void main(String[] args) {
41+
d();
42+
}
43+
}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package com.threedr3am.bug.compile.javac;
2+
3+
import java.io.IOException;
4+
import java.net.MalformedURLException;
5+
import java.net.URI;
6+
import java.net.URISyntaxException;
7+
import java.net.URL;
8+
import java.net.URLClassLoader;
9+
import java.nio.charset.Charset;
10+
import java.util.Arrays;
11+
import java.util.List;
12+
import java.util.Locale;
13+
import javax.tools.Diagnostic;
14+
import javax.tools.DiagnosticCollector;
15+
import javax.tools.JavaCompiler;
16+
import javax.tools.JavaCompiler.CompilationTask;
17+
import javax.tools.JavaFileManager.Location;
18+
import javax.tools.JavaFileObject;
19+
import javax.tools.SimpleJavaFileObject;
20+
import javax.tools.StandardJavaFileManager;
21+
import javax.tools.StandardLocation;
22+
import javax.tools.ToolProvider;
23+
24+
/**
25+
* @author threedr3am
26+
*/
27+
public class CustomJavaFileObject {
28+
29+
//使用了自定义JavaFileObject实现的动态编译
30+
public static void e() throws URISyntaxException {
31+
JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
32+
ClassLoader classLoader = CustomJavaFileObject.class.getClassLoader();
33+
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector();
34+
StandardJavaFileManager standardJavaFileManager = javaCompiler
35+
.getStandardFileManager(diagnostics, Locale.CHINA, Charset.forName("utf-8"));
36+
// 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("}");
43+
StringBuilder stringBuilder = new StringBuilder()
44+
.append("class Main {")
45+
.append(" static {")
46+
.append(" System.out.println(\"hello FFF!\");")
47+
.append(" }")
48+
.append("}");
49+
JavaFileObject javaFileObject = new JavaObjectFromString("tmp.Main", stringBuilder.toString());
50+
Iterable<? extends JavaFileObject> javaFileObjects = Arrays
51+
.asList(javaFileObject);
52+
53+
// 编译任务
54+
CompilationTask task = javaCompiler.getTask(null, standardJavaFileManager, diagnostics, null, null, javaFileObjects);
55+
Boolean result = task.call();
56+
System.out.println(result);
57+
List list = diagnostics.getDiagnostics();
58+
for (Object object : list) {
59+
Diagnostic d = (Diagnostic) object;
60+
System.out.println(d.getMessage(Locale.ENGLISH));
61+
}
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+
}
70+
}
71+
72+
public static void main(String[] args) throws URISyntaxException {
73+
e();
74+
}
75+
76+
static class JavaObjectFromString extends SimpleJavaFileObject {
77+
78+
private String content;
79+
80+
public JavaObjectFromString(String className, String content) throws URISyntaxException {
81+
super(new URI(className), Kind.SOURCE);
82+
this.content = content;
83+
}
84+
85+
@Override
86+
public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
87+
return content;
88+
}
89+
}
90+
}
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package com.threedr3am.bug.compile.javac;
2+
3+
import java.io.IOException;
4+
import java.net.URI;
5+
import java.net.URISyntaxException;
6+
import java.nio.charset.Charset;
7+
import java.util.Arrays;
8+
import java.util.HashMap;
9+
import java.util.List;
10+
import java.util.Locale;
11+
import java.util.Map;
12+
import javax.tools.Diagnostic;
13+
import javax.tools.DiagnosticCollector;
14+
import javax.tools.FileObject;
15+
import javax.tools.ForwardingJavaFileManager;
16+
import javax.tools.JavaCompiler;
17+
import javax.tools.JavaCompiler.CompilationTask;
18+
import javax.tools.JavaFileManager;
19+
import javax.tools.JavaFileObject;
20+
import javax.tools.SimpleJavaFileObject;
21+
import javax.tools.StandardJavaFileManager;
22+
import javax.tools.StandardLocation;
23+
import javax.tools.ToolProvider;
24+
25+
/**
26+
* @author threedr3am
27+
*/
28+
public class CustomJavaFileObjectAndFileManeger {
29+
30+
//使用了自定义JavaFileObject实现的动态编译
31+
public static void e() throws URISyntaxException {
32+
JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
33+
ClassLoader classLoader = CustomJavaFileObjectAndFileManeger.class.getClassLoader();
34+
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector();
35+
StandardJavaFileManager standardJavaFileManager = javaCompiler
36+
.getStandardFileManager(diagnostics, Locale.CHINA, Charset.forName("utf-8"));
37+
// FileManagerImpl fileManager = new FileManagerImpl(standardJavaFileManager);
38+
StringBuilder stringBuilder = new StringBuilder()
39+
.append("class Main {")
40+
.append(" public static void main(String[] args) {")
41+
.append(" System.out.println(\"hello FFF!\");")
42+
.append(" }")
43+
.append("}");
44+
Iterable<? extends JavaFileObject> javaFileObjects = Arrays
45+
.asList(new JavaObjectFromString("Main", stringBuilder.toString()));
46+
47+
// 编译任务
48+
CompilationTask task = javaCompiler.getTask(null, standardJavaFileManager, diagnostics, null, null, javaFileObjects);
49+
Boolean result = task.call();
50+
System.out.println(result);
51+
List list = diagnostics.getDiagnostics();
52+
for (Object object : list) {
53+
Diagnostic d = (Diagnostic) object;
54+
System.out.println(d.getMessage(Locale.ENGLISH));
55+
}
56+
}
57+
58+
public static void main(String[] args) throws URISyntaxException {
59+
e();
60+
}
61+
62+
static class JavaObjectFromString extends SimpleJavaFileObject {
63+
64+
private String content;
65+
66+
public JavaObjectFromString(String className, String content) throws URISyntaxException {
67+
super(new URI(className), Kind.SOURCE);
68+
this.content = content;
69+
}
70+
71+
@Override
72+
public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
73+
return content;
74+
}
75+
}
76+
77+
static class FileManagerImpl extends ForwardingJavaFileManager<JavaFileManager> {
78+
79+
private final Map<URI, JavaFileObject> fileObjects
80+
= new HashMap<URI, JavaFileObject>();
81+
82+
public FileManagerImpl(JavaFileManager fileManager) {
83+
super(fileManager);
84+
}
85+
86+
@Override
87+
public FileObject getFileForInput(Location location, String packageName,
88+
String relativeName) throws IOException {
89+
FileObject o = fileObjects.get(uri(location, packageName, relativeName));
90+
if (o != null) {
91+
return o;
92+
}
93+
return super.getFileForInput(location, packageName, relativeName);
94+
}
95+
96+
public void putFileForInput(StandardLocation location, String packageName,
97+
String relativeName, JavaFileObject file) {
98+
fileObjects.put(uri(location, packageName, relativeName), file);
99+
}
100+
101+
private URI uri(Location location, String packageName, String relativeName) {
102+
103+
return null;
104+
}
105+
}
106+
}
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)