5

メイン メソッドは、アプリケーションをエントリ ポイントとして起動することに関して、Java アプリケーションで最も重要なメソッドです。この方法が使用される前に何が起こるかは不明です。メソッド署名に基づいて次のように私の認識を修正することにより、メソッドが使用される前に何が起こるかを理解/明確化するのを誰かが助けてくれます:

  • JVM は、メイン メソッドにアクセスするオブジェクトを少なくとも 1 つ作成します。この (想定される) オブジェクトは、API に従って Java アプリケーションにアクセスしようとします。この API は、明らかに既知のメソッド シグネチャにバインドします。public static void main (String[] args){}

    • public API/署名ではなく、ロジックのみを完全に見て、メインメソッドを収容するオブジェクトにアクセスすることから、JVM 上の (想定される) 孤立したオブジェクトを制限することはできませんか?

    • staticインスタンス化またはオブジェクトの作成を行うオブジェクトの他のインスタンス (想定される JVM のインスタンスを除く) を作成するためのオブジェクトが起動および実行されていないだけです。static 修飾子は、インスタンスにバインドされておらず、インスタンスなしでアクセスできるため、このメソッドにアクセスできる唯一の可能性を意味します。繰り返しになりますが、これは、オブジェクトが起動して実行されていないため(想定されたJVMのものを除いて)、他のオブジェクトをインスタンス化するためのオブジェクトがまだ存在できないという論理です?

    • argsアプリケーションをカスタマイズする機能を提供する、言語およびアプリケーション/実行可能ファイル全体の標準?|

これは、主な方法にアプローチして理解するための正しく論理的な方法ですか?

4

4 に答える 4

9

あなたが本当に求めていることは完全には明らかではありませんが、JVM 仕様のセクション 5.2では、少なくとも次のいくつかをカバーしています。

Java 仮想マシンは、ブートストラップ クラスローダ (§5.3.1) を使用して、実装依存の方法で指定された初期クラスを作成することによって起動します。次に、Java 仮想マシンは初期クラスをリンクして初期化し、パブリック クラス メソッド void main(String[]) を呼び出します。このメソッドを呼び出すと、それ以降のすべての実行が駆動されます。メイン メソッドを構成する Java 仮想マシンの命令を実行すると、追加のクラスとインターフェイスがリンク (およびその結果として作成) され、追加のメソッドが呼び出される場合があります。

Java 仮想マシンの実装では、初期クラスをコマンド ライン引数として指定できます。または、実装によって、アプリケーションをロードするクラス・ローダーをセットアップする初期クラスを提供することもできます。前のパラグラフで与えられた仕様と一致する限り、初期クラスの他の選択が可能です。

JLS セクション 12.1には、他にもいくつかの説明があります。

JVM はmainメソッドを直接呼び出します。そのために新しいオブジェクトを作成する必要はありません。メソッド自体はパブリックである必要がありますが、mainそれが宣言されているクラスはパブリックではありません。例えば:

public class Test {
    private static class EntryPoint {        
        public static void main(String[] args) {
            System.out.println("Hi");
        }
    }
}

次に、次のように実行します。

java 'Test$EntryPoint'

期待どおり「こんにちは」と出力されます。

Testクラス外のコードはEntryPoint.main()、特権リフレクション、または JVM が明らかに可能な直接アクセス以外にアクセスできません。

于 2013-04-10T10:08:46.280 に答える
2

java は最初にそのコア (java.lang、クラスローダー、システム プロパティ、ランタイムなど) を起動し、次に何をする必要があるかを調べます。JVM が初期化される前は、そのプロセスに「java」はありません。これは単なるネイティブ プロセスであるため、これが発生する前に Java 用語で考えるのは間違っていると思います。

ここで、JVM ランチャーは最初に pre mains を調べ、それらを順番に呼び出し (最初にそれぞれの静的ブロックを呼び出します)、次に main メソッドを調べ、そのクラスの静的ブロックがあればそれを呼び出します。最後に main メソッドを呼び出し、すべてのコマンド ライン引数を premain および main メソッドに渡します。

簡単なテスト:

public class Test {

    static{
            System.out.println("Hi static 1");        
    }

    public static void main(String[] args) {
        System.out.println("Hi main");
    }

    static{
        System.out.println("Hi static 2 better to have 1 static block per class but you can have N ");        
    }

}

于 2013-04-10T10:51:42.927 に答える
0

たとえば、ファイルDemo.javaにはソースコードが含まれています

public class Demo{ 

}

このコードが次のように正常にコンパイルされると、

$javac Demo.java

しかし、それが次のように実行されると

$java Demo

その後、例外的なエラーが表示されます

メイン メソッドがクラス Demo に見つかりません。メイン メソッドを次のように定義してください: public static void main(String[] args)

そのため、コンパイラはmain()メソッドが存在するかどうかを確認する責任がありません。JVM がそれを担当します。main()prottotype を持つメソッドの JVM チェック

public static void main(Strings[] args)
  1. なぜ JVM 検索main()方式なのか? main()メソッドを他のメソッドに変更することは可能main_hero()ですか?

main()JVM は、JVM 内からメソッドを検索するように指示されます。main()はい、メソッドをメソッドに変更することは可能main_hero()ですが、JVM 内でメソッドを検索するように指示する必要がありますmain_hero()

JVM{ 

    public static void main(String[] args)  
}

JVM{ 

    public static void main_hero(String[] args)     
}
  1. なぜ公開?

JVM は C ドライブまたは D ドライブにインストールされるため、どこからでも呼び出すには public が使用されます。

  1. なぜ静的なのですか?

main()メソッドはオブジェクトに関連していないため、既存のオブジェクトがなくても、JVM はこのメソッドを呼び出す必要があります。mainメソッドはオブジェクトとはまったく関係ありません。

  1. なぜ無効にするのですか?

JVMはメソッドを呼び出しますmain()が、メソッドが返された場合、JVMは戻り値で何ができますかmain(). だからそれはあるはずvoidです。

于 2016-06-06T09:06:40.430 に答える
0

java someClassName のようなコマンドを入れると、流れるようなことが起こります。1. クラス someClassName をロードし、静的ブロック (存在する場合) を実行します。クラスのロード中に、クラスを表すオブジェクト クラス クラスが作成されます。2.メインメソッドが静的である理由であるクラス名を使用してメインメソッドを呼び出します(クラスのオブジェクトは作成されません)。

于 2013-04-10T10:14:17.053 に答える