将不同的建议应用于不同的范围

Apply different Advices to different Scopes

我正在尝试对不同的 类(范围)应用不同的建议。我是这样配置的:

new AgentBuilder.Default()
            .with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION)
            .type((name(equals(com.toto.titi.Class1)) or name(equals(com.toto.titi.Class2))))
            .transform(new AgentBuilder.Transformer.ForAdvice()
                    .advice(ElementMatchers
                                    .isAnnotatedWith(named(annotationClassName))
                                    .or(name(equals(com.toto.titi.Class1))))
                            , com.tata.Advice1))
            .transform(new AgentBuilder.Transformer.ForAdvice()
                    .advice(ElementMatchers
                                    .isAnnotatedWith(named(annotationClassName))
                                    .or(name(equals(com.toto.titi.Class2))))
                            , com.tata.Advice2));

我遇到的问题是两个建议(com.tata.Advice1 和 com.tata.Advice2)都应用于所有 类(com.toto.titi。 Class1 和 com.toto.titi.Class2)。而我想做的是仅将 com.tata.Advice1 应用于 com.toto.titi.Class1 并将 com.tata.Advice2 应用于 com.toto.titi.Class2.

我错过了什么?我该怎么做?

您可以将任意数量的匹配器与它们的每个转换链接在一起。如果您申请:

agentBuilder
  .type(matcher1).transform(transformer1)
  .type(matcher2).transform(transformer2)

这将只对与 1 匹配的类型应用第一个建议,反之亦然。在您的示例中,您应用:

agentBuilder
  .type(matcher1.or(matcher2)).transform(transformer1).transform(transformer2)

如果任一匹配器适用,您将同时应用两个转换器。您需要将匹配器模式从第二个概念更改为第一个。