java - 如何创建一个 bytebuddy 代理来拦截带注释字段的字段 setter ?

标签 java code-generation byte-buddy

我想做的基本上是将类的字段与注释相匹配,并拦截该字段的 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))
                ));
    }

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

最佳答案

我假设 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,找到相应的字段并检查其上是否存在注释。

关于java - 如何创建一个 bytebuddy 代理来拦截带注释字段的字段 setter ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58525469/

相关文章:

java - 如何通过Android HAL创建环回相机?

java - Hibernate 找不到 hibernate.cfg.xml

java - 如何使用默认构造函数和 setter 生成 pojo

java - 使用 ByteBuddy 的检测不适用于第 3 方类

java - 如何排除junit.framework.TestCase被Bytebuddy的@Origin拦截

java - 使用ByteBuddy更改Spring应用程序中带注释的类的包

java - 如何正确填充treeTableView

java - swing jtable默认显示多行

运行时生成的代码的 Java 垃圾收集

java - 自动生成包装器以防止 "malicious downcast"?