Byte Buddy Advice 自定义对象

问题描述 投票:0回答:1

我正在尝试使用 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
java byte-buddy
1个回答
0
投票

理论上,任何可序列化的值都可以分配给带注释的参数。然而,价值观会失去身份,比如你的

new Object()
。然而很少建议这样做,我宁愿创建一个自定义的
StackManipulation
来创建相关值。

如果适用,您还可以向检测类添加一个字段,并定义一个固定值作为该字段的值。这将保留身份,但会改变字段。

作为最后一个选项,您可以定义一个运营商类别,将值存储在全局可用的某个地图中。您可以创建一些随机字符串,例如 UUID 值。此键可以用作此映射中的查找键,然后您可以在建议中使用它来解析实际值。

© www.soinside.com 2019 - 2024. All rights reserved.