2016-10-19 6 views
2

私は(擬似コード)を持っている。このような何か:ByteBuddy:どのように揮発性のフィールドにメソッドの代表団/転送を行うための

final Class<OUT> newClass = (Class<OUT>) new ByteBuddy() 
.subclass(Object.class) 
.name(newName) 
.implement(SomeInterface.class, SomeOtherInterface.class) 
.method(ElementMatchers.isMethod())        
.intercept(
    ExceptionMethod.throwing(UnsupportedOperationException.class, 
          "calling this method is not supported")) 
// in fact I am matching for more than a single method here 
.method(ElementMatchers.named("getUuid")) 
.intercept(
    MethodDelegation.toInstanceField(SomeOtherInterface.class, "delegate")) 
.make() 
.load(aBusinessEntityClass.getClassLoader(), ClassLoadingStrategy.Default.WRAPPER) 
.getLoaded(); 

私の現在の問題がある:私は揮発性であることを私のデリゲートフィールドを必要とします。それをどうすれば実現できますか?

+0

あなたの提案された解決策は、残念なことに、最も簡単です。私はAPIを将来のバージョンでより柔軟にするよう努めていきます:https://github.com/raphw/byte-buddy/issues/202 –

+0

@RafaelWinterhalter:あなたのコメントをお寄せいただきありがとうございます。 –

答えて

1

わかりましたが、私の作品解決策を見つけ、ケースには誰もが興味を持っている:

final Class<OUT> newClass = (Class<OUT>) new ByteBuddy() 
.subclass(Object.class) 
.name(newName) 
.implement(SomeInterface.class, SomeOtherInterface.class) 
.method(ElementMatchers.isMethod())        
.intercept(
    ExceptionMethod.throwing(UnsupportedOperationException.class, 
         "calling this method is not supported")) 
// in fact I am matching for more than a single method here 
.method(ElementMatchers.named("getUuid")) 
.intercept(
    MethodDelegation.toInstanceField(SomeOtherInterface.class, "delegate")) 
// -- HERE THE FIELD IS MODIFIED AGAIN, IN THIS CASE AS -- 
// -- PRIVATE & VOLATILE         -- 
.field(ElementMatchers.named("delegate"))      
.transform(Transformer.ForField.withModifiers(FieldManifestation.VOLATILE, Visibility.PRIVATE)) 
.make() 
.load(aBusinessEntityClass.getClassLoader(), ClassLoadingStrategy.Default.WRAPPER) 
.getLoaded(); 

溶液)(変換フィールド()を呼び出して、その後フィールドを変更することでした適切なTransformer.ForField.withModifiers()

誰もがこの問題に直面するのを手伝ってください。

2

toInstanceField APIは、あなたではなく、明示的にフィールドを定義する新しい計装APIの賛成でバイトバディ1.5.0で引退した。

new ByteBuddy() 
    .defineField("delegate", SomeOtherInterface.class, VOLATILE) 
    .method(ElementMatchers.named("getUuid")) 
    .intercept(MethodDelegation.toField("delegate")); 

これは、などの注釈を追加するなど、他のことを行うことができます

このアプローチはすべてImplementationに対して実装されました。新しいバージョンが今日リリースされました。

+0

ああ、それは私の問題の素晴らしい解決策です。将来のプロジェクトでは、私はおそらくそれを検討するでしょう! :-) –

関連する問題