0
Can I redefine private methods using Byte Buddy?という考え方に基づいて、私は親クラスからプライベートメソッドを再定義したいと思います。 これは可能ですか?それとも、鶏肉と卵の問題のようなものですか?Byte Buddyを使用して親クラスからプライベートメソッドを再定義することはできますか?
ありがとうございます!
Can I redefine private methods using Byte Buddy?という考え方に基づいて、私は親クラスからプライベートメソッドを再定義したいと思います。 これは可能ですか?それとも、鶏肉と卵の問題のようなものですか?Byte Buddyを使用して親クラスからプライベートメソッドを再定義することはできますか?
ありがとうございます!
プライベートメソッドは仮想的にはディスパッチされないため、サブクラス内でプライベートメソッドのディスパッチを変更することはできません。これを行う唯一の方法は、条件付きディスパッチをプライベートメソッドに直接ハードコードすることです。
Byte BuddyのAdvice
クラスとJavaエージェントを組み合わせて使用できます。 Javaエージェントは、次のようになります。
MyAdvice
のコードが
privateMethod
というメソッドのbefinningにインライン化され
new AgentBuilder.Default()
.disableClassFormatChanges()
.with(RedefinitionStrategy.REDEFINITION)
.type(is(ClassWithPrivateMethod.class))
.transform((builder, type, cl, module) -> {
return builder.visitor(Advice.to(MyAdvice.class)
.on(named("privateMethod")));
}).install(inst);
。 trueを返すことにより
class Adv {
@OnMethodEnter(skipOn = OnNonDefaultValue.class)
static boolean intercept(@This ClassWithPrivateMethod self) {
if (self instanceof ParentClass) {
// Your code
return true;
} else {
return false;
}
}
}
とfalse
が返された場合、スキップconiditonを使用して、あなただけの実際のコードを実行:条件付きの発送は次のようになります。
あなたが求めていることは明確ではありません。 'private'メソッドは宣言クラスにのみ関連します。これは再定義しなければならないクラスです。このクラスが別のクラスのスーパークラスであるかどうかは関係ありません。 – Holger
Aのプライベートメソッドは、他のパッケージ保護されたプライベートメソッドを呼び出すため、置換またはコピーしたくないので、私はAのプライベートメソッドをB(サブクラス)に再定義する必要があります。 –
'B'にはそのようなメソッドはありません。 'A'の' private'メソッドは 'A'のみに存在します。あなたの仕事を解決する唯一の方法は、 'A'の' private'メソッドを 'this instanceof B'チェックを行い、チェックが 'false'と評価された場合は古いコードに委譲するメソッドに置き換えることです。 ByteBuddyがこのような計測器をサポートしているかどうかはわかりませんが、とにかく疑わしいデザインのように見えます。 – Holger