首先我们要明白一件事情,Java 是如何编译运行的 。

我们编写的 Java 代码本质上是一堆字符串 .java。

接着被编译成字节码文件 .class

接下来我们就有了思路。

  1. 生成 .java文件
  2. 生成字节码文件
  3. 运行字节码文件截取结果
  4. 截取耗费时间,正确答案。

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\r\n3\r\n5\r\n7\r\n11\r\n13\r\n17\r\n19\r\n23\r\n29\r\n31\r\n37\r\n41\r\n43\r\n47\r\n53\r\n59\r\n61\r\n67\r\n71\r\n73\r\n79\r\n83\r\n89\r\n97\r\n")) {
                        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\t\r\n" +
                            "1*2=2\t2*2=4\t\r\n" +
                            "1*3=3\t2*3=6\t3*3=9\t\r\n" +
                            "1*4=4\t2*4=8\t3*4=12\t4*4=16\t\r\n" +
                            "1*5=5\t2*5=10\t3*5=15\t4*5=20\t5*5=25\t\r\n" +
                            "1*6=6\t2*6=12\t3*6=18\t4*6=24\t5*6=30\t6*6=36\t\r\n" +
                            "1*7=7\t2*7=14\t3*7=21\t4*7=28\t5*7=35\t6*7=42\t7*7=49\t\r\n" +
                            "1*8=8\t2*8=16\t3*8=24\t4*8=32\t5*8=40\t6*8=48\t7*8=56\t8*8=64\t\r\n" +
                            "1*9=9\t2*9=18\t3*9=27\t4*9=36\t5*9=45\t6*9=54\t7*9=63\t8*9=72\t9*9=81\t\r\n";
                    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,\r\n" +
                            "1,1,\r\n" +
                            "1,2,1,\r\n" +
                            "1,3,3,1,\r\n" +
                            "1,4,6,4,1,\r\n";
                    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;

    }

根据 反射机制调用相对应的 方法 进行答案判断

最后我们判断结果把返回即可。

请输入图片描述

最后修改:2022 年 02 月 18 日 11 : 27 AM
如果觉得我的文章对你有用,请随意赞赏