Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在shell中,是否有Java工具来检查哪些编译的.class文件有main方法?_Java_Shell_Main - Fatal编程技术网

在shell中,是否有Java工具来检查哪些编译的.class文件有main方法?

在shell中,是否有Java工具来检查哪些编译的.class文件有main方法?,java,shell,main,Java,Shell,Main,我正在整理一些(Python)脚本,以帮助我对数百个简单的学生Java repo进行自动评分。并非所有这些文件都具有相同的目录结构或文件命名。我已经遍历了它们并编译了它们,如果我做了假设,我可以运行它们并测试它们,等等。但是我想知道是否有一种方法可以找到包含main()方法的“main”.class,这样我就不必对它们的文件命名进行假设(无论如何,这不会一直起作用) 我知道反射,所以是的,我知道我可以编写另一个简单的助手Java程序来帮助我自己识别它。但是我想知道是否已经存在任何东西(java命

我正在整理一些(Python)脚本,以帮助我对数百个简单的学生Java repo进行自动评分。并非所有这些文件都具有相同的目录结构或文件命名。我已经遍历了它们并编译了它们,如果我做了假设,我可以运行它们并测试它们,等等。但是我想知道是否有一种方法可以找到包含
main()
方法的“main”.class,这样我就不必对它们的文件命名进行假设(无论如何,这不会一直起作用)

我知道反射,所以是的,我知道我可以编写另一个简单的助手Java程序来帮助我自己识别它。但是我想知道是否已经存在任何东西(
java
命令行选项、来自jdk的工具等等)来测试.class文件,看看它是否包含
main()
方法

我想知道是否已经存在任何东西(java命令行选项、来自JDK的工具等)来测试.class文件,看看它是否包含main()方法

JavaSE中没有直接实现这一点的工具或选项

我知道我可以写另一个简单的助手Java程序来帮助我

编写一个shell脚本来迭代文件树、查找
.class
文件、对它们调用
javap
,并搜索具有适当
main
方法签名的方法会更简单

或者您可以在源代码树上执行类似的操作



(回想起来,您应该设置作业要求,以便学生必须为包含其主要方法的类使用指定的类和包名。但是现在这样做已经太晚了…

我们只需调用
java-cp即可main
方法,则code>将完全崩溃,或者将运行相关代码。现在,如果代码无法正常运行,并且出现错误,您可能会认为它与没有
main
方法的效果相同

public class HasMain {
    public static void main(String[] args) {
        System.out.println("Hit main");
    }
}
public class HasDoIt {
    public static void doIt(String[] args) {
        System.out.println("Hit doIt");
    }
}
public class WillBlowUp {
    public static void main(String[] args) {
        System.out.println("Hit blowUp");
        throw new IllegalStateException("oops");
    }
}
使用PowerShell:

PS D:\Development\sandbox> javac HasMain.java
PS D:\Development\sandbox> javac HasDoIt.java
PS D:\Development\sandbox> javac WillBlowUp.java

PS D:\Development\sandbox> java -cp . HasMain                                                                                                                                                                                                                                  
Hit main

PS D:\Development\sandbox> $?                                                                                                                                                                                                                                                  
True

PS D:\Development\sandbox> java -cp . HasDoIt                                                                                                                                                                                                                                  
Error: Main method not found in class HasDoIt, please define the main method as:
   public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application

PS D:\Development\sandbox> $?                                                                                                                                                                                                                                                  
False

PS D:\Development\sandbox> java -cp . WillBlowUp                                                                                                                                                                                                                               
Hit blowUp
Exception in thread "main" java.lang.IllegalStateException: oops
    at WillBlowUp.main(WillBlowUp.java:4)

PS D:\Development\sandbox> $?                                                                                                                                                                                                                                                  
False

<简单地检查返回值可以快速测试类是否有你想要的,尽管任何退出(1)类型返回将在C++天中抛出错误的false /p>< p>,将头文件分发到使用共享对象文件是一个大问题。如果没有两者,人们会得到一个或另一个,而且你总是有可能得到不匹配的版本

Java用
javap
修复了这个问题,它打印编译的
.class
文件的方法(和其他主要接口)

要测试类文件是否有主文件,请运行

javap SomeFile.class
它将列出所有公共接口。在该列表中,查看是否有“主入口点”

现在,要大规模处理此问题,只需创建一个Python脚本:

  • 查找所有相关类
  • 在类上运行
    javap
  • 读取匹配的方法的输出(在开始时,因为在“publicstaticvoidmain(java.lang.String[])末尾可能有数量可变的异常)
  • 你会找到所有的入口点


    请记住,有时单个库或JAR文件有许多入口点,其中一些并不是主要入口点。

    类似的问题似乎得出了相同的结论(反射或提取.class文件和使用
    javap
    )谢谢你的建议。是的,我已经教了7年了,所以我知道如何调整作业。对于CS1学生,我让他们保持正常。对于其他课程,我让他们组织他们认为合适的方式。我以前也用其他语言写过自动评分器。我不是在强调这一点,只是检查是否有现有的工具……尽管我不是crazy关于这个解决方案,这似乎是共识。正如一些人提到的,也可能有多个入口点,因此确实需要“调查”来找到它们。这并没有找到包含
    main
    方法的文件。它测试您可能已经找到的类。(从理论上讲,这也是危险的;例如,如果学生包含了一个秘密的第二个“主”类,该类会悄悄地对运行代码的机器做一些令人讨厌的事情。尽管如此,这无论如何都是一个问题……)
    public static void main(java.lang.String[])