Java 如何创建一个bytebuddy代理,从带注释的字段中截取字段设置器?

Java 如何创建一个bytebuddy代理,从带注释的字段中截取字段设置器?,java,code-generation,byte-buddy,Java,Code Generation,Byte Buddy,我试图做的基本上是将类的字段与注释匹配,然后它们截取字段的getter和setter 公共类Foo{ @敏感的 私人串废话; 以下是我的代理人的代码: private static AgentBuilder createAgent(){ 返回新代理生成器 .Default() .与(AgentBuilder.重新定义策略.重新转换) .type(ElementMatchers.is(FieldTypeMatcher.class.)和(ElementMatchers.isAnnotatedWit

我试图做的基本上是将类的字段与注释匹配,然后它们截取字段的getter和setter

公共类Foo{
@敏感的
私人串废话;
以下是我的代理人的代码:

private static AgentBuilder createAgent(){
返回新代理生成器
.Default()
.与(AgentBuilder.重新定义策略.重新转换)
.type(ElementMatchers.is(FieldTypeMatcher.class.)和(ElementMatchers.isAnnotatedWith(Foo.class)))
.transform((生成器、类型描述、类加载器、模块)->
建设者
.method(method->method.getActualName().contains(typeDescription.getActualName()))
.intercept(Advice.to(Interceptor.class))
));
}

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

我假设
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);
  }
}
类FieldMatcher实现ElementMatcher{
@凌驾
公共布尔匹配(MethodDescription目标){
字符串字段名;
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);
}否则{
返回false;
}
target.getDeclaringType()
.getDeclaredFields()
.filter(已命名)
.getOnly()
.getDeclaredAnnotations()
.isAnnotationPresent(敏感类);
}
}

这个匹配器检查一个方法是否是getter或setter,找到相应的字段并检查其上是否存在注释。

嗨,Rafael,非常感谢你这么快的回答!我知道你所做的要点,尽管我的IDE告诉我它无法解析
。isAnnotationPresent
。我使用的是bytebuddy 1.10.1我正在使用另一个版本?我在DSL中遗漏了一个步骤,现在已经修复了。