1

java.nio.ByteBuffer実際にはプライベートクラスのインスタンスであるパブリック抽象クラスインスタンスがjava.nio.HeapByteBufferあり、呼び出しメソッドハンドラーを呼び出してアクセス許可を確認し、実際のインスタンスで呼び出されたメソッドを呼び出すプロキシオブジェクトを作成する必要があります。

問題は、java.nio.ByteBufferクラスにプライベート コンストラクターしかなく、最終メソッドもいくつかあるため、javassist.util.proxy.ProxyFactoryクラスでプロキシ インスタンスを作成できないことです。

java.nio.ByteBufferでは、これらの最終メソッドの呼び出しを含むインスタンスの呼び出しを制御するプロキシ オブジェクトを作成するにはどうすればよいでしょうか?

4

3 に答える 3

1

2つの解決策を提案できます。

まず、単純で、普遍的ではありませんが、おそらく役に立つでしょう。

私が見る限り、サブクラス化と次のメソッドByteBufferを許可するいくつかのパッケージプライベートコンストラクターがあります。final

public final ByteBuffer put(byte[] src) {
public final boolean hasArray() {
public final byte[] array() {
public final int arrayOffset() {
public final ByteOrder order() {

ByteBufferBufferこれらのメソッドのいくつかを宣言するextends :

public final boolean hasArray() {
public final Object array() {
public final int arrayOffset() {

ご覧のとおり、put()ここにはありませんがorder()、戻り値の型はarray()少し混乱しますが、それでも使用できます。したがって、これら 3 つのメソッドのみを使用する場合は、を含むBuffer他のすべてをラップするユニバーサル ラッパーをサブクラス化して作成できます。私見ですが、必ずしもここにあるとは限りませんが、必要に応じてjavaassistのプロキシを使用できます。BufferByteBuffer

第二に、より普遍的ですが、よりトリッキーな解決策です。クラスのロード中に特定のクラス(あなたの場合)finalから修飾子を削除するエージェントを作成できます。ByteBuffer次に、javassist プロキシを作成できます。

2 番目のソリューションのバリエーションは次のとおりです。ByteBufferソース コードを別のプロジェクトにコピーします。修飾子を削除finalしてコンパイルします。次に、ブートストラップ クラスパスにプッシュします。このソリューションは、おそらく 2 番目よりも簡単です。

とにかく頑張ってください。

于 2014-09-16T10:17:54.450 に答える