为了账号安全,请及时绑定邮箱和手机立即绑定

如何创建一个 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 关注
  • 95 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信