1

我试图弄清楚如何使用 Byte Buddy 设置实例字段的值。文档说:

在调用此类动态类的实例的方法之前,请始终记住为该字段分配一个值。否则,方法委托将导致 NullPointerException。

但是我在文档或单元测试中看不到如何做到这一点。

我的动态课程是:

new ByteBuddy().subclass(AbstractService.class)
        .name(serviceName)
        .method(ElementMatchers.named("start").and(
                ElementMatchers.takesArguments(0)))
        .intercept(
                MethodDelegation.toInstanceField(service, "consumer")
                    .filter(ElementMatchers.isAnnotatedWith(Start.class)))
        .method(ElementMatchers.named("stop").and(
                ElementMatchers.takesArguments(0)))
        .intercept(
                MethodDelegation.to(instance).filter(
                        ElementMatchers.isAnnotatedWith(Stop.class)))
        .make();

我看到另一个帖子的答案是拦截任何构造函数并@FieldProxy与 a 一起使用,MethodDelegation但我不知道该怎么做。我在结果方面所做的一切尝试都会导致结果的一些变化.constructor(ElementMatchers.any()).intercept(...)

java.lang.IllegalArgumentException: [] 中的任何一个都不允许来自...的委派

4

1 回答 1

0

基本上,当您使用MethodDelegation.toInstanceFieldByte Buddy 时,会将给定名称的字段添加到生成的类中。在您的情况下,Byte Buddy 添加了一个service名为"consumer".

您现在需要决定如何为该字段分配值,因为该字段没有值,即null在分配之前。@Start如果您在这样做之前调用了一个带有注释的方法,您会遇到一个NullPointerException.

分配字段的最简单方法是反射。一个类型安全的替代方案是实现一些接口

interface SetterIFace {
  void setConsumer(MyType myType);
}

鉴于您的service类型是Class<MyType>. 然后您可以添加:

.implement(SetterIFace.class).intercept(FieldAccessor.ofBeanProperty())

在. SetterIFace_MethodDelegation

于 2016-07-04T08:31:32.207 回答