2

サードパーティのオープンソースのfinalクラスのnon-finalメソッドをオーバーライドしたいと思います。

final class A 
{
    void put(obj a)
    {...}

    obj get()
    {...}
}

get()およびメソッドをオーバーライドする方法を教えてください。put()それでも、このクラスの他の動作と機能は保持されます。

4

5 に答える 5

13

それはオープンソースです:それをフォークして、クラスを非ファイナルにします。

非ファイナルにしないと拡張できません。

于 2012-10-03T17:18:27.680 に答える
4

クラスに、put メソッドと get メソッドが定義されている定義済みのインターフェイスがある場合は、クラスをプロキシすることをお勧めします。

最も簡単な方法は、次のようなものを作成することです。

public interface CommonInterface {

void put(); Object get();

}

final class A implements CommonInterface
{

void put(obj a)
{...}
obj get()
{...}

}

public class ProxyToA implements CommonInterface{

   private A a;

  void put(Object a){
   // your override functionality

  } 

    Object get(){
       // same here
    }

   void otherAStuff(){
        a.otherAStuff();
   }

}

次に、CommonInterface を使用してオブジェクトをプロキシします。または、JDK プロキシ、javassist などを使用できます。

于 2012-10-03T17:23:29.987 に答える
1

finalクラスを拡張することはできません。Java仕様による。

于 2012-10-03T17:18:12.327 に答える
0

クラスが final である理由を確実に見つけようとする必要があります。それを行っても問題ないと確信できる場合は、別のオプションとして、AspectJを使用してこれら 2 つのメソッドの動作を変更するだけです。

AspectJを使用すると、特定のメソッドの動作を変更できます。メソッドに対してもこれを行うことができますprivate(セキュリティ上の制約が許す限り)。また、クラスのプライベート フィールドにアクセスして割り当てることもできます。

于 2012-10-03T17:23:39.983 に答える
0

簡単に言えば、クラスを拡張できないため、メソッドをオーバーライドできないということです。get メソッドと put メソッドをオーバーライドして何をする予定ですか? これらのメソッドに機能を追加する場合は、このクラスをラップする別のクラスを作成できます。

于 2012-10-03T17:23:59.417 に答える