15

私はJVM バイトコード命令を調べていて、クラス間のすべての相互作用 (キャストnewなど) が、他のクラスの ID に対する定数プール ルックアップに依存していることに驚きました。

これは、1 つのクラスが 64,000 を超える他のクラスの存在を知ることができないことを意味すると推測するのは正しいですか?それらを参照することは不可能なので? その多くを参照する必要がある場合、どうすればよいでしょうか?それぞれが <64k 相互作用を持つ可能性のある複数のクラスに作業を委譲しますか?

(私がこれに興味を持った理由は、コード ジェネレーターを書く習慣があり、時には何千もの異なるクラスを生成することと、一部の言語 (Scala など) が大量にクラスを作成することです。 1 つのクラスに数百のメソッドがあり、それぞれが数百の (異なる) クラスを使用している場合、一定のプール スペースを超える可能性があります)。

4

2 に答える 2

5

これは、1 つのクラスが 64,000 を超える他のクラスの存在を知ることができないことを意味すると推測するのは正しいですか?

私はあなたが正しいと思います。また、他のものに対して一定のプール エントリがあることを忘れないでください。たとえば、すべてのクラスのメソッド名とフィールド名、およびそのすべてのリテラル文字列です。

その多くを参照する必要がある場合、どうすればよいでしょうか?それぞれが <64k 相互作用を持つ可能性のある複数のクラスに作業を委譲しますか?

たぶんそうだ。

ただし、この懸念が実際に実現されるとは確信していません。コード ジェネレーターがその入力ソース コードの構造を無視していない限り、他の多くのクラスと直接対話する必要があるクラスを想像するのは困難です。

于 2013-05-04T16:06:06.870 に答える
1

あなたの問題は経由で解決できるようinvokedynamicです。これは基本的に、JVM での動的言語の実装を容易にするために設計された、はるかに高速な形式のリフレクションです。

何千もの自動生成されたクラスを実際に処理する必要がある場合は、おそらくすべてを静的にリンクしたくないでしょう。を使用するだけinvokedynamicです。これには、一部のコード生成を実行時に延期できるという利点もあります。

クラスによって呼び出される動的メソッドごとに定数プール エントリが引き続き必要ですが、呼び出される実際のクラスとメソッドを参照する必要がなくなることに注意してください。実際、オンデマンドで作成できます。

于 2013-05-04T16:18:40.927 に答える