gpt4 book ai didi

java - 使用 ByteBuddy 创建步骤生成器

转载 作者:行者123 更新时间:2023-11-30 02:18:14 26 4
gpt4 key购买 nike

我正在尝试让 ByteBuddy 实现一个步骤构建器,并给出该构建器的接口(interface)。我被困在两个地方。

  1. 如何创建一个返回方法链接当前实例的 setter?

我开始于:

.method(ElementMatchers.isSetter())
.intercept(FieldAccessor.ofBeanProperty());

只有我想返回当前的构建器实例,以便我们可以链接调用,例如:

final Object obj = ...builder().id(100).name("test").build();

所以我创建了一个像这样的拦截器,这看起来像是一个黑客,我想尽可能避免反射:

@RuntimeType
public Object intercept(@RuntimeType Object arg, @This Object source, @Origin Method method)
{
try
{
// Field name is same as method name.
final Field field = source.getClass().getDeclaredField(method.getName());
field.setAccessible(true);
field.set(source, arg);
}
catch (Throwable ex)
{
throw new Error(ex);
}

// Return current builder instance.
return source;
}
  • 有没有一种简单的方法可以在不反射的情况下访问我定义的类上的定义字段?
  • 目前,我在循环中向构建器类添加字段,并且构建器上的构建方法被拦截,如下所示:

    private static final class InterBuilder
    {
    private final Collection<String> fields;
    private final Constructor<?> constructor;

    InterBuilder(final Constructor<?> constructor, final Collection<String> fields)
    {
    this.constructor = constructor;
    this.fields = fields;
    }

    @RuntimeType
    public Object intercept(@This Object source, @Origin Method method)
    {
    try
    {
    final Object[] args = Arrays.stream(source.getClass().getDeclaredFields())
    .filter(f -> this.fields.contains(f.getName()))
    .map(f -> { try {
    f.setAccessible(true);
    return f.get(source); }
    catch (Throwable ex) { throw new Error(ex); } })
    .toArray();

    // Invoke a constructor passing in the private field values from the builder...
    return this.constructor.newInstance(args);
    }
    catch (Throwable ex)
    {
    throw new Error(ex);
    }
    }
    }

    我看到了@FieldValue注释。我不认为有什么东西可以给我所有字段而不预先知道它们的名字?

    此时,代码是概念证明。有更好的方法来完成我在这里所做的事情吗?
    谢谢!

    最佳答案

    您可以编写两个实现:

    FieldAccessor.ofBeanProperty().setsArgumentAt(0).andThen(FixedValue.self());

    这将首先设置 setter(索引 0)参数,然后返回 this

    如果您想在不反射的情况下从 MethodDelegation 设置字段,请查看 FieldProxy

    关于java - 使用 ByteBuddy 创建步骤生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47642861/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com