亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何創建一個 bytebuddy 代理來攔截帶注釋字段的字段設置器?

如何創建一個 bytebuddy 代理來攔截帶注釋字段的字段設置器?

不負相思意 2023-12-13 15:00:14
我想做的基本上是將類的字段與注釋相匹配,并攔截該字段的 getter 和 setter。 public class Foo {    @Sensitive    private String Blah;這是我的代理的代碼:    private static AgentBuilder createAgent() {        return new AgentBuilder                .Default()                .with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION)                .type(ElementMatchers.is(FieldTypeMatcher.class).and(ElementMatchers.isAnnotatedWith(Foo.class)))                .transform(((builder, typeDescription, classLoader, module) ->                        builder                        .method(method -> method.getActualName().contains(typeDescription.getActualName()))                        .intercept(Advice.to(Interceptor.class))                ));    }我雖然可以將字段的名稱與方法的簽名相匹配,但我沒有運氣。
查看完整描述

1 回答

?
繁花如伊

TA貢獻2012條經驗 獲得超12個贊

我假設Foo有一個 getter 和 setter Blah?


在這種情況下,我建議使用自定義ElementMatcher實現,例如:


class FieldMatcher implements ElementMatcher<MethodDescription> {

  @Override

  public boolean matches(MethodDescription target) {

    String fieldName;

    if (target.getName().startsWith("set") || target.getName().startsWith("get")) {

      fieldName = target.substring(3, 4).toLowerCase() + target.substring(4);

    } else if (target.getName().startsWith("is")) {

      fieldName = target.substring(2, 3).toLowerCase() + target.substring(3);

    } else {

      return false;

    }

    target.getDeclaringType()

      .getDeclaredFields()

      .filter(named)

      .getOnly()

      .getDeclaredAnnotations()

      .isAnnotationPresent(Sensitive.class);

  }

}

該匹配器檢查方法是否是 getter 或 setter,找到相應的字段并檢查其上是否存在注釋。


查看完整回答
反對 回復 2023-12-13
  • 1 回答
  • 0 關注
  • 160 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號