我正在尝试使用 byte buddy,感谢您在以下方面的帮助: 鉴于我有以下课程
public class MyAdvice {
private String param1;
private Object param2;
public MyAdvice(String param1, Object param2) {
this.param1 = param1;
this.param2 = param2;
}
}
我想将其传递给我的拦截器,这可能吗? 我读过有关将值绑定到注释的内容,我认为我遗漏了一些内容,因为我只能使其与 String 类一起使用
MyAdvice[] myAdvice = new MyAdvice[1];
myAdvice[0] = new MyAdvice("123", new Object());
builder.method(ElementMatchers.named(setterMethodName)
.and(ElementMatchers.takesArguments(1)))
.intercept(Advice.withCustomMapping()
.bind(Custom.class, myAdvice)
.to(SetterInterceptor.class))
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface Custom { }
public class SetterInterceptor {
public static void intercept(@Argument(0) Object value @Custom MyAdvice[] myAdvice) {
// custom code, do something with myAdvice
}
}
这样的事情可能吗?
@Custom MyAdvice[] myAdvice
理论上,任何可序列化的值都可以分配给带注释的参数。然而,价值观会失去身份,比如你的
new Object()
。然而很少建议这样做,我宁愿创建一个自定义的 StackManipulation
来创建相关值。
如果适用,您还可以向检测类添加一个字段,并定义一个固定值作为该字段的值。这将保留身份,但会改变字段。
作为最后一个选项,您可以定义一个运营商类别,将值存储在全局可用的某个地图中。您可以创建一些随机字符串,例如 UUID 值。此键可以用作此映射中的查找键,然后您可以在建议中使用它来解析实际值。