问题描述
我正在整理一些(Python)脚本,以帮助我自动完成对数百个简单的学生Java存储库的评分。并非所有人都具有相同的目录结构或文件命名。我已经遍历了它们并进行了编译,如果我做出了假设,我可以运行它们并对其进行测试,等等。但是我想知道是否可以找到具有{{1 }}中的方法,这样我就不必对它们的文件命名做任何假设了(无论如何,它始终无法工作)。
我知道反射,所以是的,我知道我可以编写另一个简单的辅助Java程序来帮助我自己识别它。但是我想知道是否已经存在任何东西(main()
命令行选项,jdk中的工具等)来测试.class文件以查看其是否具有java
方法。>
解决方法
我想知道是否已经存在任何东西(java命令行选项,JDK中的工具等)来测试.class文件以查看其是否具有main()方法。
Java SE中没有直接执行此操作的工具或选项。
我知道我可以编写另一个简单的辅助Java程序来帮助我...
编写一个shell脚本来简化文件树,查找.class
文件,在它们上调用javap
,然后为具有适当main
方法签名的方法进行抓取会更简单
或者您可以在源代码树上执行类似的操作。
(回想起来,您应该设置作业要求,以便学生必须为包含其主要方法的班级使用指定的班级和程序包名称。但是现在为时已晚...)
,在C ++时代,分发头文件以使用共享对象文件是一件大事。人们会在没有两者的情况下得到一个或另一个,并且总是有机会得到不匹配的版本。
Java使用javap
修复了该问题,该问题打印了已编译的.class
文件的方法(和其他主要接口)。
要测试类文件是否具有主文件,请运行
javap SomeFile.class
将列出所有公共接口。在该列表中,查看它是否具有“主入口点”
public static void main(java.lang.String[])
现在要进行大量处理,只需创建一个Python脚本即可:
- 找到所有相关的类。
- 在课程上运行
javap
。 - 读取匹配方法的输出(开头,因为结尾处可以有可变数量的Exceptions“ public static void main(java.lang.String [])
您将找到所有入口点。
请记住,有时单个库或JAR文件具有许多入口点,其中一些不打算用作主要入口点。
,如果类没有java -cp . <file>
方法,简单地调用main
将会完全崩溃,或者将运行相关代码。现在,如果代码无法正确运行并出错,您可能会发现它与没有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
因此,简单地检查返回值可能是测试类是否具有所需内容的快速方法,尽管任何exit(1)类型的return都将抛出false-false