サードパーティのオープンソースのfinalクラスのnon-finalメソッドをオーバーライドしたいと思います。
final class A
{
void put(obj a)
{...}
obj get()
{...}
}
get()
およびメソッドをオーバーライドする方法を教えてください。put()
それでも、このクラスの他の動作と機能は保持されます。
それはオープンソースです:それをフォークして、クラスを非ファイナルにします。
非ファイナルにしないと拡張できません。
クラスに、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 などを使用できます。
final
クラスを拡張することはできません。Java仕様による。
クラスが final である理由を確実に見つけようとする必要があります。それを行っても問題ないと確信できる場合は、別のオプションとして、AspectJを使用してこれら 2 つのメソッドの動作を変更するだけです。
AspectJを使用すると、特定のメソッドの動作を変更できます。メソッドに対してもこれを行うことができますprivate
(セキュリティ上の制約が許す限り)。また、クラスのプライベート フィールドにアクセスして割り当てることもできます。
簡単に言えば、クラスを拡張できないため、メソッドをオーバーライドできないということです。get メソッドと put メソッドをオーバーライドして何をする予定ですか? これらのメソッドに機能を追加する場合は、このクラスをラップする別のクラスを作成できます。