私はこれが通常かなり愚かであることを知っていますが、質問を読む前に私を撃たないでください。私はこれを行う必要がある正当な理由があることを約束します:)
リフレクションを使用してJavaの通常のプライベートフィールドを変更することは可能ですが、Javaがfinal
フィールドに対して同じことを行おうとすると、セキュリティ例外がスローされます。
これは厳密に強制されていると思いますが、誰かがこれを行うためのハックを見つけた場合に備えて、とにかく尋ねると思いました。
SomeClass
クラス「 」を持つ外部ライブラリがあるとしましょう。
public class SomeClass
{
private static final SomeClass INSTANCE = new SomeClass()
public static SomeClass getInstance(){
return INSTANCE;
}
public Object doSomething(){
// Do some stuff here
}
}
私は基本的に、自分のバージョンのを実行できるように、SomeClassをモンキーパッチしますdoSomething()
。(私の知る限り)Javaで実際にそれを行う方法はないので、ここでの唯一の解決策は、の値を変更INSTANCE
して、変更されたメソッドでクラスのバージョンを返すようにすることです。
基本的には、セキュリティチェックで呼び出しをラップしてから、元のメソッドを呼び出したいだけです。
外部ライブラリは常にgetInstance()
このクラスのインスタンスを取得するために使用します(つまり、シングルトンです)。
編集:明確にするために、getInstance()
私のコードではなく外部ライブラリによって呼び出されるので、サブクラス化するだけでは問題は解決しません。
それができない場合、私が考えることができる他の唯一の解決策は、クラス全体をコピーして貼り付け、メソッドを変更することです。ライブラリの変更に合わせてフォークを最新の状態に保つ必要があるため、これは理想的ではありません。誰かがもう少し保守しやすいものを持っているなら、私は提案を受け入れます。