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