- PR -

java.applet.AudioClipインターフェースについて

1
投稿者投稿内容
phirq
会議室デビュー日: 2006/11/24
投稿数: 3
投稿日時: 2006-11-24 10:26
初歩的な質問なんですがjava.applet.AudioClipインターフェースにおいて定義されているloop(),stop(),play()のメソッド達はどのように実装されるものなのでしょうか。
AudioClip ac;
ac = getAudioClip(getDocumentBase(), "音楽データのある所");
ac.play();
としただけで音楽が流れると解説されているのですが、抽象メソッドであるplay()をどこでどのように実装しているのかわかりません。
よろしくお願いします。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2006-11-24 12:07
引用:

phirqさんの書き込み (2006-11-24 10:26) より:
初歩的な質問なんですがjava.applet.AudioClipインターフェースにおいて定義されているloop(),stop(),play()のメソッド達はどのように実装されるものなのでしょうか。



Javaが環境を選ばず実行できるのはJavaVM(バーチャマシン)のおかげですが、
そのレベルで各OS用のインターフェースの実装が用意されています。
私の手元のSUN提供のWindows版Java5の場合は
sun.applet.AppletAudioClipというクラスが実装クラスのようですね。

ふだんはAudioClipを実装した何かが一体なにものであろうと、
メソッドを使った際に期待した動作さえしてくれればいいわけです。

それこそ自分でJavaVMでも作ろうと考えない限りは意識しなくてもいい。
非常に有難いことですね。
phirq
会議室デビュー日: 2006/11/24
投稿数: 3
投稿日時: 2006-11-24 15:36
えーと、つまり
ac.play();
のplay();がよみこまれると自動的に実装クラスのほうのメソッドへ作業が移るのですか、その場合、実装クラスの存在はacからわかるのかなぁ?
それとも、そもそおac.play();が実装クラスのメソッドをそのままさしているのかな?わからん。。
本当に申し訳ないのですが
ソースをVMが読み込んでから実行するまでの流れを説明してもらえませんでしょうか?
ちょっとまだつかめてない状況です。
本当にすいません。

[ メッセージ編集済み 編集者: phirq 編集日時 2006-11-24 15:47 ]
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2006-11-24 17:20
引用:

phirqさんの書き込み (2006-11-24 15:36) より:
えーと、つまり
ac.play();
のplay();がよみこまれると自動的に実装クラスのほうのメソッドへ作業が移るのですか、その場合、実装クラスの存在はacからわかるのかなぁ?
それとも、そもそおac.play();が実装クラスのメソッドをそのままさしているのかな?わからん。。
本当に申し訳ないのですが
ソースをVMが読み込んでから実行するまでの流れを説明してもらえませんでしょうか?



まず、このあたりの動きを理解するにはオブジェクト指向のポリモーフィズムについて
理解している必要があります。
そこに関しては検索すればいろいろ出てくるでしょうし、実際にコードを書いて
挙動を確認しないと理解できないところでしょうから、別途理解してもらうものとします。

まず、Appletを作る際ですが、Appletクラスを継承したクラスを作りますね。
これをMyAppletとしましょう。
AudioClipを使うためにgetAudioClip(URL)を呼び出すと、
AudioClipを実装したクラスが返ってきます。
ではこのAudioClipを取得する処理はどこに書かれているかといいますと、
MyAppletではgetAudioClip(URL)を定義していませんから、
親クラスのAppletのgetAudioClip(URL)に書かれていることになります。

JDKにはjavaのAPIのソースコードが付いているので
(JDKのインストールフォルダのsrc.zipを解凍する。以下はJDK1.5のソースより抜粋)
そちらでApplet.getAudioClip(URL)を見ると
コード:
    public AudioClip getAudioClip(URL url) {
	return getAppletContext().getAudioClip(url);
    }


というコードになっています。
Applet.getAppletContext()は
コード:
    public AppletContext getAppletContext() {
	return stub.getAppletContext();
    }


となっていて、このstubという変数は
コード:
    transient private AppletStub stub;


と宣言されています。ここでAppletStubはなんだろうとjavadocを参照しましょう。
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/applet/AppletStub.html

Appletのソースを見ると、このインターフェースの実装をAppletの実装クラス、
つまりMyAppletに設定するのにはsetStub(AppletStub)が使われているようです。

http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/applet/Applet.html#setStub(java.applet.AppletStub)
引用:

アプレットのスタブを設定します。この処理は、システムによって自動的に行われます。



ということが分かります。
さて、話をまとめましょう。

1.ブラウザがAppletを発見するとJava-pluginが起動する。
2.Java-pluginがMyAppletのインスタンスを作成し、setStubでこの環境用の
  AppletStubの実装をMyAppletに設定する。
3.MyAppletでgetAudioClip(URL)を呼び出す。
4.親クラスのAppletのgetAudioClip(URL)が呼ばれる
5.getAppletContext()で取得したAppletContextのgetAudioClip(URL)が呼ばれる。
  つまり、2で設定されたAppletStubの実装クラスのgetAudioClip(URL)が呼ばれる。
6.AppletStubの実装クラスがAudioClipインターフェースの実装を作って返す

という動きになります。
インターフェースさえ決まっていれば、あとはポリモーフィズムで実装クラスが
そのクラスごとに責任を果たしてくれるはずです。
その実装クラスはAppletの実行環境が提供しているわけです。

ソースコードを追いかけられるようになれば、分かると思いますが、
いろいろな箇所で最後にはOS依存の部分に突き当たるのですが、
そういう部分ではこの例のようにインターフェースだけ用意されていて
実装は各環境が用意すると言う作りになっていることが多いですね。
phirq
会議室デビュー日: 2006/11/24
投稿数: 3
投稿日時: 2006-11-24 18:43
非常に詳しく説明していただきありがとうございます。かなり理解は深まって、よりいっそう勉強する意欲がわいてきました。
ほんとうにありがとうございました
1

スキルアップ/キャリアアップ(JOB@IT)