【问题标题】:How to create a bytebuddy agent that intercepts a field setter from annotated field?如何创建一个 bytebuddy 代理来拦截带注释字段的字段设置器?
【发布时间】:2020-02-19 20:31:40
【问题描述】:

我要做的基本上是将类的字段与注释匹配,然后它们拦截该字段的 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))
                ));
    }

虽然我可以将字段名称与方法的签名匹配,但我没有运气。

【问题讨论】:

    标签: java code-generation byte-buddy


    【解决方案1】:

    我假设Foo 有一个用于Blah 的getter 和setter?

    在这种情况下,我推荐一个自定义的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,定位相应的字段并检查其上是否存在注释。

    【讨论】:

    • 嗨,Rafael,非常感谢您这么快回答!尽管我的 IDE 告诉我它无法解析 .isAnnotationPresent,但我了解您正在做的事情的要点。我使用的是 bytebuddy 1.10.1,我应该使用其他版本吗?
    • 我在 DSL 中遗漏了一个步骤,现在已修复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多