2016-12-01 6 views
1

実行時に効率的なプロパティアクセサーを生成しようとしています。ゲッター/セッターのペアのためにこれを行うByteBuddyを使用して計測されたメソッドのパラメータのフィールドにアクセスする

class SomeProperty implements PropertyAccess<String> { 
    public void set(Object o, String s) { 
     ((SomeClass) o).setFoo(s); 
    } 
    public String get(Object o) { 
     return ((SomeClass) o).getFoo(); 
    } 
} 

は(gettersetter簡単です:

interface PropertyAccess<T> { 
    void set(Object instance, T value); 
    T get(Object instance); 
} 

実装は次のようになります。具体的にこれは私がByteBuddyを使用して、次のインタフェースを実装するクラスを生成しています意味します)実際のゲッター、セッターのためのjava.lang.reflect.Methodオブジェクトであること:

new ByteBuddy() 
    .subclass(Object.class) 
    .implement(PropertyAccess<String>.class) // pseudo syntax, I am using Guava's TypeToken here in reality 
    .method(named("get")).intercept(invoke(getter).onArgument(0)) 
    .method(named("set")).intercept(invoke(setter).onArgument(0).withArgument(1)) 

(私は彼を残しアサイナの入力をObjectからSomeClassにキャストできるようにする)。

しかしFieldAccessorはフィールドのみ生成されたクラスの(へのアクセスを可能にしますので、今、私は、また、直接アクセスフィールドのようなクラスを生成できるように、私はカスタムImplementationクラスを記述せずにそうする方法を見つけることができませんしたいですまたはそのうちの1つ)。

何か不足していますか?

答えて

0

現在のところ、方法ではなくフィールドにアクセスする方法はありません。私はゲッターやセッターに似たフィールドアクセスを扱うことで修正するのは簡単だと思います。私はticket #225でこの制限を追跡しています。

+0

ありがとうございます!私はそのことに注意を払うつもりだ。 – diesieben07

関連する問題