Date: Wed, 17 Sep 97 21:40:27 JST From: SHUDOH Kazuyuki Subject: [JavaHouse-Brewers:12720] Re: [Q] the way of 'class passing' To: java-house-brewers at center.nitech.ac.jp (JavaHouse Brewers ML) Message-Id: <199709171242.VAA13249@cafe.olu.info.waseda.ac.jp> 首藤です。 忍頂寺さん wrote: 忍> できれば,*.classファイルを操作せずにクラスの転送をしてみたかったので 忍> すが,クラスファイルをバイト列化したものを渡す現状の方法がどうも正道の 忍> ようですね. 忍> # 補足しますと,ファイルシステムを持たないホスト間のクラス転送を実現し 忍> # たかったのです.ホストAのJVM上で展開されているクラスをホストBのJVMに 忍> # もっていけたら,今作っているアプリケーションがもっと軽快なものになる 忍> # のかなと想像してしまったのです. それを実現しようと、コードを書きはじめてしばらくしてつまづきました。 以下、JDK に含まれる JavaVM を前提に書きます。 クラスファイルが一旦 JavaVM に読み込まれてしまうと、 JavaVM 内の情報からクラスファイルと同等のものを復元するのは なかなか難しいです。 まず、constant pool 中の各要素から種類情報が落ちてしまいます。 種類情報とは、クラスファイル中では 1バイトのタグで表される CONSTANT_Utf8 (1) 〜 CONSTANT_NameAndType (12) のことです。 もちろん、[JavaHouse-Brewers:12099] でたなかさんが示された(*)ように クラス中すべてのメソッドのコードを追って constant pool 中の要素の 種類を判別することは不可能ではないです。が、現実的じゃないです。:) #segmentation violation を利用して識別したら #どの程度の確率で正しく識別できるかな。:):) (*) スタック上の 32bit の値がオブジェクトへのハンドルなのか即値なのか 識別できないよ〜、という私の嘆きに対して [JavaHouse-Brewers:12099] でたなかさん wrote: > スタックフレームをたどって、すべての呼び出されているメソッドを調べて見 > てゆくと静的にスタック上の型が得られるので、完全に識別できます。 > が、性能的に明らかに問題がありそうです:-):-)。 SHUDOH Kazuyuki/首藤一幸 私をたばねないで あらせいとうの花のように shudoh at muraoka.info.waseda.ac.jp