【问题标题】:Change execution starting point of Java program改变Java程序的执行起点
【发布时间】:2015-03-23 05:50:11
【问题描述】:

这是我被问到的一个面试问题。我们都知道Java程序的执行是从main方法开始的,签名如下:

public static void main(String[] arg)

有没有办法将 Java 程序的执行起点更改为另一种方法,比如通过调整任何 JVM 配置参数?

【问题讨论】:

  • 您可以添加静态块,使其成为起点。
  • Applet 也可以,也是非常基本的方式。
  • 我认为这根本不是一个好主意或必要的,它使人们感到困惑,甚至可能存在安全问题。你应该问面试官为什么他们需要这样做。

标签: java


【解决方案1】:

没有。不管应用程序在幕后做了什么,或者事情可能如何被摆弄,你的程序必须包含一个声明为public static void main(String[] args)(或args 的一些可变参数声明)的方法。

the JLS, section 12 中对此进行了概述:

Java 虚拟机通过加载一个指定的类然后在这个指定的类中调用方法main 来启动。

如果 main 不存在,则会出现运行时错误 - 具体来说,NoSuchMethodError(它会抱怨找不到 main)。

【讨论】:

    【解决方案2】:

    有没有办法将 Java 程序的执行起点更改为另一种方法,比如通过调整任何 JVM 配置参数?

    答案是否定的。你不能。

    当普通JVM开始运行一个类时,它会在类中寻找main方法。jvm就是这样设计的。

    您还可以在答案中添加.. java 程序还有其他执行模型。例如applet、servlet等

    applet 将在没有 main 方法的情况下在支持 jvm 的浏览器中运行。 servlet 将在没有 main 方法的 servlet 容器中运行。

    您在静态块中添加的任何内容都会在 main 之前执行……但如果没有 main,该类仍然无法运行。因此,理论上你可以通过添加一个静态块来改变java程序的起点,但是如果类中没有main,程序执行将失败。

    如果你想继续炫耀,那么你可以说因为 main 不是关键字..我们可以更改 jvm 代码以识别另一个方法名称而不是 main ..但是为此我们更改 jvm 代码..不能作为参数传递

    【讨论】:

      【解决方案3】:

      确实可以通过几种方法中的任何一种方法启动应用程序,通过选择具有我想要的 ma​​inclass,所有这些方法都被称为 main。我一直这样做是为了测试。我会将这种技术视为调整 JVM 配置参数。以下是 java 文档中关于它的说明。

      【讨论】:

        猜你喜欢
        • 2011-01-30
        • 1970-01-01
        • 2012-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-01
        • 1970-01-01
        相关资源
        最近更新 更多