ByteBuffer を拡張することはできません。神に感謝します。
保護された c-tors がない場合、b/c を拡張することはできません。なぜ神に感謝するのですか?実際のサブクラスが 2 つしかないため、JVM はByteBuffer を含むすべてのコードを大幅に最適化できます。
最後に、実際にクラスを拡張する必要がある場合は、バイト コードを編集し、保護された属性 c-tor と public 属性を DirectByteBuffer (および DirectByteBufferR) に追加するだけです。とにかく基になる配列にアクセスできるため、HeapBufferを拡張しても何の目的もありません
そこに独自のクラスを使用-Xbootclasspath/p
して追加し、必要なパッケージを拡張します(java.nioの外部)。それがその方法です。
もう 1 つの方法は、sun.misc.Unsafe を使用して、後でメモリに直接アクセスして必要なことを行うことですaddress()
。
パフォーマンス上の理由からこれを行いたいと思います。たとえば、getInt には約 10 回のメソッド呼び出しと、かなりの数の if があります。すべてのチェックが残され、メソッド呼び出しのみがインライン化され、ビッグ/スモール エンディアン チェックが削除された場合でも、私が作成したテストでは、約 4 倍高速になることが示されています。
gdb を使用して、実際に生成されたマシン コードをチェックすると、削除されるチェックの数に驚かれることでしょう。
なぜ人がクラスを拡張したいのか想像できません。オブジェクト指向ポリモーフの実行だけでなく、優れたパフォーマンスを可能にするために存在します。
編集:
クラスを宣言して Java ベリファイアをバイパスする方法
Unsafe の場合: Unsafe にはベリファイアをバイパスする 2 つのメソッドがあり、ByteBuffer を拡張するクラスがある場合は、それらのいずれかを呼び出すことができます。コンパイラのためだけに、パブリックアクセスと保護されたc-torを備えたByteBufferのハッキングされたバージョン(ただし、それは非常に簡単です)が必要です。方法は以下のとおりです。自己責任で使用できます。そのようにクラスを宣言した後、new キーワードを使用することもできます (適切な c-tor がある場合)。
public native Class defineClass(String name, byte[] b, int off, int len, ClassLoader loader, ProtectionDomain protectionDomain);
public native Class defineClass(String name, byte[] b, int off, int len);