- ベストアンサー
JVM(Java仮想マシン)の動作原理を教えて下さい。
JVM(Java仮想マシン)の動作原理を教えて下さい。 Javaバイトコードとして定義される命令セットを見たところ、比較的単純な命令しかありません。 Swingライブラリのようにウィンドウ表示などの環境に依存するプログラムがバイトコードでどのように表現されているのか教えて下さい。 つまり、Swingライブラリを使う側のバイトコードではなく、Swingライブラリ側のバイトコードはどのようになっているのでしょうか? (Swingに限らず、環境に依存する部分のバイトコードの表現がどのようになっているかを知りたいのです。)
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
クラスファイルのレベルでは, ネイティブメソッドは「ネイティブフラグが立っている (従ってそのクラスファイルでは定義されていない)」メソッドでしかありません. なので, メソッドを呼び出すどの命令によってもネイティブメソッドを呼び出すことができるはず.
その他の回答 (2)
- salsberry
- ベストアンサー率69% (495/711)
invokeinterface, invokespecial, invokestatic, invokevirtualのいずれもネイティブメソッドを呼べます。 ANo.2の方が既に書いているとおり、メソッドを呼ぶ側では呼び先がネイティブメソッドなのか普通のJavaのメソッドなのかを区別しません。だから、メソッドを呼ぶためのバイトコードはネイティブメソッドを呼ぶ場合も普通のJavaのメソッドを呼ぶ場合も同じです。
お礼
わかりました。ありがとうございます!
- salsberry
- ベストアンサー率69% (495/711)
Javaにはネイティブメソッドというものがあって、CやC++で書かれた関数をJavaのプログラムから呼ぶことができます。 グラフィクスでもファイルアクセスでも、最終的にはネイティブメソッドを呼ぶことで環境依存部分を実装しています。
補足
ネイティブメソッド自体は機械語に翻訳されるのでしょう。(C/C++で記述されれば、C/C++コンパイラでコンパイルされ、通常のオブジェクトが生成されるのでしょう。) そのネイティブメソッドを呼び出し(Java側)は、バイトコード上はどのように表現されるのでしょうか? 具体的なオペコードは何でしょうか? (invokevirtual, invokespecial, invokestatic,invokeinterfaceのいずれかですか?)
お礼
わかりました。ありがとうございます!