filename.class
ファイルをjava
コマンドの後に入力するのはなぜですか、代わりにfilename
?"java"コマンドで.class拡張子を使用しないのはなぜですか?
test.java
プログラムをコンパイルして、javac test.java
を実行するとします。それは大丈夫です!
その後、test.class
ファイルが生成されますが、プログラムを実行するにはの代わりにjava test
を実行します。これの理由は何ですか?
filename.class
ファイルをjava
コマンドの後に入力するのはなぜですか、代わりにfilename
?"java"コマンドで.class拡張子を使用しないのはなぜですか?
test.java
プログラムをコンパイルして、javac test.java
を実行するとします。それは大丈夫です!
その後、test.class
ファイルが生成されますが、プログラムを実行するにはの代わりにjava test
を実行します。これの理由は何ですか?
ファイルを実行すると記述されていないためです。 クラスにはメインメソッドが含まれています。クラス名はfilename
で、filename.class
ではありません。
バイトコードがほとんど常にファイルシステム上のファイルに含まれているという事実は実装の詳細です。 java
コマンドに渡すクラスパスはとなります。ここではがクラスを検索し、次にメインクラスの引数がどのクラスを使用するかを指示します。
(それは、このプログラムは、具体的ソースにファイルを取るんので、javac
ため違うとバイトコードにコンパイルします。)
コードがJAR内にあるか、クラスパス上の他の場所にある可能性があります。 – bstempi
あなたは、どちらかのjavaコマンドにファイル名を渡しません。完全修飾クラス名を渡します。 com.yourcompany.yourapp.Main
のようなものです。 Javaは、クラスパス内のすべてのディレクトリとjarファイルを調べることによって、このクラス名の.classファイルを見つけます。
実装の詳細です。 Javaクラスローダーシステムは、カスタムコードによって拡張され、異なる動作をさせることができます。たとえば、暗号化されたクラスファイルを復号化して読み込み可能な暗号化されたクラスローダを書いている企業もあります。 Jarファイル(実際にはzipファイル)ではなく、.NETアセンブリに似たものにたくさんのクラスをバンドルする同様のシステムを仮想的に作成することができます。
あなたは "java test.class
"
を実行するときは、 "java test.class
" の "java
は" jvm
あるので、これはどちらか
Could not find or load main class test.class
または
Exception in thread "main" java.lang.NoClassDefFoundError: test/class
を取得します。 "test
"の代わりに "class
"というクラスのmainメソッドを探します。 「java test.class
」のドットは重要な意味を持ちます。したがって、どのようにjvm
"java test.class
"を見て、 "test
"と呼ばれるパッケージでは、それは "class
"というJavaクラスを探します。
*test.class*
*test* - package name
*class* - java filename
javacコンパイラは、プログラム のJavaバイトコードのバイト版が含まれているXyz.class(ここでXYZはファイル名です) と呼ばれるファイルを作成するには、Javaインタプリタが実行される命令を含むプログラムの中間表現に他なりません。
ので、javacの出力を直接ショートに
を実行可能なコードではありません私たちは、その後のjavac(コンパイル済みファイルの.classファイル)での.classを使用した場合、javacのキーワードがコンパイル用のJavaプログラム を使用していますどのようにファイル
をコンパイルすでにコンパイルすることができますので、有効な構文は次のとおりです。 あるJavac Xyz.java(Javaのプログラムをコンパイル) javaのエクシーズ(Javaのプログラムを実行)
これは質問に答えません。 FILEを実行するために 'java'が呼び出されない点を逃してしまいます。クラス名にはファイル名の.class拡張子が含まれていません。 – GhostCat
最終的には、それはそれは設計されています方法ですので。それは異なって設計されている可能性がありますが、以下の答えが示唆するように、 ".class"をタックするとパッケージ名の解析が混乱し、疑いの余地はありません。そのようなもののための「論理的な」設計は決してありません。他の設計よりも非論理的な設計だけです。 –