首先我们要明白一件事情,Java 是如何编译运行的 。
我们编写的 Java 代码本质上是一堆字符串 .java。
接着被编译成字节码文件 .class
接下来我们就有了思路。
生成 .java 文件
生成字节码文件
运行字节码文件截取结果
截取耗费时间,正确答案。
1. 生成 .java 文件
public void sendFile(String tiContext, String uuid) {
String path = Config.TiUrl;
File file = new File(path);
if (!file.exists()) {
file.mkdirs();
}
String context = "import java.util.*;" +
"public class Test" + uuid + " {" +
tiContext +
"}";
try {
BufferedWriter bw = new BufferedWriter(new FileWriter(Config.TiUrl + "Test" + uuid + ".java"));
bw.write(context);
bw.close();
} catch (Exception e) {
e.printStackTrace();
}
}
对的 使用 Java UUID 生成唯一的 Java 类
使用 提前准备好的 模板
把用户提交的信息提交进去
紧接着使用 IO 流生成一个 Java 文件
那么现在 用户提交的 .java 文件已经生成了
2. 生成字节码文件
现在来编译一下
/**
* 编辑java文件
*
* @return
*/
public int compile(String uuid) {
try {
// Runtime run = Runtime.getRuntime();
// Process process = run.exec("javac " + "D:/java/ti/" + className + "/" + username + "/" + "Test" + topicId + ".java");
// process.waitFor();
// process.destroy();
Runtime run = Runtime.getRuntime();
System.out.println("javac " + Config.TiUrl + "Test" + uuid + ".java");
Process process = run.exec("javac " + Config.TiUrl + "Test" + uuid + ".java");
process.waitFor();
process.destroy();
} catch (Exception e) {
throw new MyException(e.getMessage());
}
return 1;
}
我们调用 javac 编译 生成好的 java 文件
我们收获了 相对应的字节码文件。
3. 运行字节码文件
public Map check(String topicId, String uuid) {
boolean flog = false;
try {
// 加载这个文件夹下所有的class文件
File file = new File(Config.TiUrl);
URL[] uris = {file.toURI().toURL()};
URLClassLoader loader = URLClassLoader.newInstance(uris);
//获取指定类的字节码文件
Class<?> demo1Claz = loader.loadClass("Test" + uuid);
Object o = demo1Claz.newInstance();
ByteArrayOutputStream baoStream = new ByteArrayOutputStream(1024);
PrintStream cacheStream = new PrintStream(baoStream);
PrintStream oldStream = System.out;
System.setOut(cacheStream);//不打印到控制台
SpeckTime.start();
switch (topicId) {
case "1":
//运行class文件
Method add = demo1Claz.getMethod("add", Integer.class, Integer.class);
int res = (int) add.invoke(o, 456, 151);
if (res == 607) {
flog = true;
}
break;
case "20":
Method getMax = demo1Claz.getMethod("getMax", int[].class);
res = (int) getMax.invoke(o, new int[]{1, 2, 3, 4, 999});
if (res == 999) {
flog = true;
}
case "21":
Method shuixianhua = demo1Claz.getMethod("shuixianhua");
shuixianhua.invoke(o);
String strMsg = baoStream.toString();
System.setOut(oldStream);
if (strMsg.equals("153"+System.getProperty("line.separator")+"370371"+System.getProperty("line.separator")+"407"+System.getProperty("line.separator"))) {
flog = true;
}
break;
case "22":
Method getCountOfStr = demo1Claz.getMethod("getCountOfStr", String.class, String.class);
int c = (int) getCountOfStr.invoke(o, "ccooeeqqcc", "c");
if (c == 4) {
flog = true;
}
break;
case "23":
Method getDa = demo1Claz.getMethod("getDa", int.class, int.class);
res = (int) getDa.invoke(o, 9, 5);
System.out.println(res);
if (res == 9) {
flog = true;
}
break;
case "24":
Method printZhiShu = demo1Claz.getMethod("printZhiShu");
printZhiShu.invoke(o);
strMsg = baoStream.toString();
System.setOut(oldStream);
if (strMsg.equals("2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 ")) {
flog = true;
}
break;
case "25": {
Method getMax1 = demo1Claz.getMethod("getMax", int[][].class);
int a[][] = {{1, 3, 4}, {2, 1, 5}, {6, 3, 2}};
res = (int) getMax1.invoke(o, (Object) a);
if (res == 6) {
flog = true;
}
}
break;
case "26": {
Method getMaxYue = demo1Claz.getMethod("getMaxYue", int.class, int.class);
res = (int) getMaxYue.invoke(o, 4, 6);
int res2 = (int) getMaxYue.invoke(o, 3, 9);
if (res == 2 && res2 == 3) {
flog = true;
}
}
break;
case "27": {
Method huiWen = demo1Claz.getMethod("huiWen", String.class);
boolean res27 = (boolean) huiWen.invoke(o, "aba");
boolean res2 = (boolean) huiWen.invoke(o, "pgoagnkagak");
if (res27 && !res2) {
flog = true;
}
}
break;
case "28": {
Method trimSpace = demo1Claz.getMethod("trimSpace", String.class);
if ("acfted".equals((String) trimSpace.invoke(o, " a c f t e d"))
&& "4485375".equals((String) trimSpace.invoke(o, "4 4 85 3 7 5"))) {
flog = true;
}
}
break;
case "29":
Method jiujiu = demo1Claz.getMethod("jiujiu");
jiujiu.invoke(o);
String strMsg29 = baoStream.toString();
System.setOut(oldStream);
String a = "1*1=1 " +
"1*2=2 2*2=4 " +
"1*3=3 2*3=6 3*3=9 " +
"1*4=4 2*4=8 3*4=12 4*4=16 " +
"1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 " +
"1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 " +
"1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 " +
"1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 " +
"1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81 ";
System.out.println(strMsg29);
System.out.println();
System.out.println(a);
if (strMsg29.equals(a)) {
flog = true;
}
break;
case "30":
Method aaa = demo1Claz.getMethod("aaa", int.class);
aaa.invoke(o, 5);
strMsg = baoStream.toString();
System.setOut(oldStream);
a = "1, " +
"1,1, " +
"1,2,1, " +
"1,3,3,1, " +
"1,4,6,4,1, ";
System.out.println(strMsg);
System.out.println();
System.out.println(a);
if (strMsg.equals(a)) {
flog = true;
}
break;
case "31": {
Method lifanggen = demo1Claz.getMethod("lifanggen", double.class);
double res27 = (double) lifanggen.invoke(o, 27);
double res271 = (double) lifanggen.invoke(o, 125);
if (res27 == 3.0 && res271 == 5.0) {
flog = true;
}
}
break;
default:
break;
}
} catch (Exception e) {
flog = false;
}
Map end = SpeckTime.end();
end.put("flog", flog);
return end;
}
根据 反射机制调用相对应的 方法 进行答案判断
最后我们判断结果把返回即可。
代码范式,不要喷,我当时只是为了完成作业
前端编辑器:
Ace editor 在线网页版的 vscode! 代码编辑器 | Vue.js 技术论坛 (learnku.com)