2013-07-17 9 views
7

filename.classファイルをjavaコマンドの後に入力するのはなぜですか、代わりにfilename"java"コマンドで.class拡張子を使用しないのはなぜですか?

test.javaプログラムをコンパイルして、javac test.javaを実行するとします。それは大丈夫です!

その後、test.classファイルが生成されますが、プログラムを実行するにはの代わりにjava testを実行します。これの理由は何ですか?

+2

最終的には、それはそれは設計されています方法ですので。それは異なって設計されている可能性がありますが、以下の答えが示唆するように、 ".class"をタックするとパッケージ名の解析が混乱し、疑いの余地はありません。そのようなもののための「論理的な」設計は決してありません。他の設計よりも非論理的な設計だけです。 –

答えて

20

ファイルを実行すると記述されていないためです。 クラスにはメインメソッドが含まれています。クラス名はfilenameで、filename.classではありません。

バイトコードがほとんど常にファイルシステム上のファイルに含まれているという事実は実装の詳細です。 javaコマンドに渡すクラスパスはとなります。ここではがクラスを検索し、次にメインクラスの引数がどのクラスを使用するかを指示します。

(それは、このプログラムは、具体的ソースにファイルを取るんので、javacため違うとバイトコードにコンパイルします。)

+0

コードがJAR内にあるか、クラスパス上の他の場所にある可能性があります。 – bstempi

6

あなたは、どちらかのjavaコマンドにファイル名を渡しません。完全修飾クラス名を渡します。 com.yourcompany.yourapp.Mainのようなものです。 Javaは、クラスパス内のすべてのディレクトリとjarファイルを調べることによって、このクラス名の.classファイルを見つけます。

1

実装の詳細です。 Javaクラスローダーシステムは、カスタムコードによって拡張され、異なる動作をさせることができます。たとえば、暗号化されたクラスファイルを復号化して読み込み可能な暗号化されたクラスローダを書いている企業もあります。 Jarファイル(実際にはzipファイル)ではなく、.NETアセンブリに似たものにたくさんのクラスをバンドルする同様のシステムを仮想的に作成することができます。

0

あなたは "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 

-1

javacコンパイラは、プログラム のJavaバイトコードのバイト版が含まれているXyz.class(ここでXYZはファイル名です) と呼ばれるファイルを作成するには、Javaインタプリタが実行される命令を含むプログラムの中間表現に他なりません。
ので、javacの出力を直接ショートに

を実行可能なコードではありません私たちは、その後のjavac(コンパイル済みファイルの.classファイル)での.classを使用した場合、javacのキーワードがコンパイル用のJavaプログラム を使用していますどのようにファイル

をコンパイルすでにコンパイルすることができますので、有効な構文は次のとおりです。 あるJavac Xyz.java(Javaのプログラムをコンパイル) javaのエクシーズ(Javaのプログラムを実行)

+0

これは質問に答えません。 FILEを実行するために 'java'が呼び出されない点を逃してしまいます。クラス名にはファイル名の.class拡張子が含まれていません。 – GhostCat