トランザクション管理

/**
 * @when
 *         access.variable = field
 *         field = {@link CtField}
 *         {@link ThreadLocalize} in field.annotations.spec
 */
public void hack(CtVariableAccess<?> access)
  1. accessは変数へのアクセス (引数 CtVariableAccess accessから推論)
  2. accessの属性"variable"(アクセス先の変数)はfieldである
  3. fieldはフィールドである
  4. fieldの属性"annotations"(注釈一覧)をt1とおくと
    1. t1それぞれの属性"spec"(注釈の型)の一覧をt2とおくと
      1. 型 ThreadLocalize は t2 に含まれる

まとめると、@ThreadLocalizeの注釈がついたフィールドへの参照を返します。

上記だと左辺値も右辺値も拾ってしまうので、もう少しフィルタかける必要あり。

ともあれ、特定のフィールドを見つけるのは簡単にできるのですが、これらに対して1度だけ加工する方法について考え中です。
あるクラスに対するクエリの適用を1度だけに限定して、その単位を「クエリの実行セッション」とかにするのはどうかなと。

@Before, @Afterらしきものをつければ、コンストラクトとデコンストラクト時に作業できるとか。