gpt4 book ai didi

java - 在 ByteBuddy 中实现方法来更改运行时可发现的字段

转载 作者:行者123 更新时间:2023-12-01 18:10:42 25 4
gpt4 key购买 nike

我正在使用 Byte Buddy 在运行时创建类 Bean 接口(interface)的类,从而减少了大量的样板代码。从 getter 和 setter 创建字段很简单,但我想更多地利用 Byte Buddy。对于初学者来说,我不想到处编写这样的代码:

    if (obj.getMax() < obj.getMin()) {
int temp = obj.getMax();
obj.setMax(obj.getMin());
obj.setMin(temp);
}

obj.setMax(obj.getMax() + 1);
int currentMax = getMax();

当我可以做的时候:

    obj.enforceMinMaxOrder();
int currentMax = obj.incrementAndGetMax();

这是一个简短的示例。我怎样才能使用Byte Buddy来使上述两项工作?大概使用拦截器类,但我还没有遇到任何修改字段的示例。重要的事情:

  • 这些字段在编译时是未知的,它们将从方法名称中提取(即“enforceMinMaxOrder”方法名称使用“min”和“max”作为字段名称)
  • 我希望避免在 Byte Buddy 生成类后使用运行时反射,但保留对字段或方法的引用并调用它们就可以了。

    DynamicType.Builder<? extends Object> builder = new ByteBuddy().subclass(Object.class);
    builder = builder.implement(MyInterface.class);
    builder = builder.method(
    (isGetter().or(isSetter())))
    .intercept(FieldAccessor.ofBeanProperty());
    for (Method m : MyInterface.class.getMethods()) {
    String methodName = m.getName();
    Class<?> t = m.getReturnType();
    if (t != void.class && methodName.startsWith("get")) {
    String fieldName = Character.toLowerCase(methodName.charAt(3)) + methodName.substring(4);
    builder = builder.defineField(fieldName, t, Visibility.PUBLIC);
    builder = builder.method(named(fieldName)).intercept(FieldAccessor.ofField(fieldName));
    }
    }

    MyInterface obj = (MyInterface) builder.make().load(BeanUtil.class.getClassLoader()).getLoaded().getConstructor().newInstance();

    obj.setMin(10);
    obj.setMax(5);

    obj.incrementAndGetMin();
    obj.ensureMinMaxOrder();
    // now, the values should be min=5, max=11

最佳答案

我认为最好的调用是使用 Advice ,它可以让您编写稍后内联到生成的类中的代码模板:

class MinMaxAdvice {
@Advice.OnMethodExit
static void minMax(@Min int min, @Max int max) { ... }
}

该方法实现您的代码并可以覆盖任何字段值。由于您的解析对方法名称敏感,因此您需要为自定义注释 @Min@Max 添加自己的绑定(bind),请查看 Advice。 withCustomBinding() API 了解如何完成此操作。您可以重用已经存在的字段绑定(bind),但您必须以您想要实现此目的的方式定位这些字段。

关于java - 在 ByteBuddy 中实现方法来更改运行时可发现的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60472416/

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