从外壳程序,是否有Java工具可以检查哪些已编译的.class文件具有主要方法?

问题描述

我正在整理一些(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脚本即可:

  1. 找到所有相关的类。
  2. 在课程上运行javap
  3. 读取匹配方法的输出(开头,因为结尾处可以有可变数量的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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...