2017-02-17 6 views
0

Can I redefine private methods using Byte Buddy?という考え方に基づいて、私は親クラスからプライベートメソッドを再定義したいと思います。 これは可能ですか?それとも、鶏肉と卵の問題のようなものですか?Byte Buddyを使用して親クラスからプライベートメソッドを再定義することはできますか?

ありがとうございます!

+0

あなたが求めていることは明確ではありません。 'private'メソッドは宣言クラスにのみ関連します。これは再定義しなければならないクラスです。このクラスが別のクラスのスーパークラスであるかどうかは関係ありません。 – Holger

+0

Aのプライベートメソッドは、他のパッケージ保護されたプライベートメソッドを呼び出すため、置換またはコピーしたくないので、私はAのプライベートメソッドをB(サブクラス)に再定義する必要があります。 –

+0

'B'にはそのようなメソッドはありません。 'A'の' private'メソッドは 'A'のみに存在します。あなたの仕事を解決する唯一の方法は、 'A'の' private'メソッドを 'this instanceof B'チェックを行い、チェックが 'false'と評価された場合は古いコードに委譲するメソッドに置き換えることです。 ByteBuddyがこのような計測器をサポートしているかどうかはわかりませんが、とにかく疑わしいデザインのように見えます。 – Holger

答えて

0

プライベートメソッドは仮想的にはディスパッチされないため、サブクラス内でプライベートメソッドのディスパッチを変更することはできません。これを行う唯一の方法は、条件付きディスパッチをプライベートメソッドに直接ハードコードすることです。

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を使用して、あなただけの実際のコードを実行:条件付きの発送は次のようになります。

関連する問題