首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用ByteBuddy对不确定类字段添加setter方法?

如何使用ByteBuddy对不确定类字段添加setter方法?
EN

Stack Overflow用户
提问于 2022-05-16 15:26:39
回答 1查看 147关注 0票数 1

根据官方的例子,为字段生成getter/setter方法可以通过实现一个接口来完成。但这正是我确切知道哪些字段将被添加到类中的时候。我的程序每次都从数据库中获取要添加的字段,因此我需要在运行时为这些字段添加getter/setter方法。

我定义了一个getter方法,并使用FieldAccessor方法将其赋值为。当我以相同的方式定义setter方法并将其指定为FieldAccessor时,系统会抛出一个异常。

下面是一个简化的示例代码:

代码语言:javascript
运行
复制
@Data
public class MappingFieldBO {
    private String fieldName;
    private int maxScore;
    public MappingFieldBO() {
    }
    public MappingFieldBO(String fieldName, int maxScore) {
        this.fieldName = fieldName;
        this.maxScore = maxScore;
    }
}

@Data
public class BaseMappingFieldBO {
    private Long id;
}
代码语言:javascript
运行
复制
public class Main {
    public static void main(String[] args) {
        List<MappingFieldBO> mappingFields = getFromDB();
        DynamicType.Builder<BaseMappingFieldBO> builder = new ByteBuddy()
                .subclass(BaseMappingFieldBO.class)
                .name("io.buyan.dv.console.MappingBean");
         // add uncertain fields to class
        for (MappingFieldBO mappingField : mappingFields) {
            String fieldName = mappingField.getFieldName();
            builder = builder.defineField(fieldName, String.class, Visibility.PUBLIC)
                    // define getter method
                    .defineMethod(getterName(fieldName), String.class, Visibility.PUBLIC)
                    .intercept(FieldAccessor.ofField(fieldName))
                    // define setter method
                    // throw IllegalArgumentException: Method public void io.buyan.dv.console.MappingBean.setShipping() is no bean accessor
                    .defineMethod(setterName(fieldName), Void.TYPE, Visibility.PUBLIC)
                    .intercept(FieldAccessor.ofField(fieldName));
        }
        Class<? extends BaseMappingFieldBO> clazz = builder.make().load(Thread.currentThread().getContextClassLoader()).getLoaded();
    }

    private static String setterName(String fieldName) {
        return "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
    }
    private static String getterName(String fieldName) {
        return "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
    }

    private static List<MappingFieldBO> getFromDB() {
        List<MappingFieldBO> list = new ArrayList<>();
        list.add(new MappingFieldBO("shipping", 10));
        list.add(new MappingFieldBO("deduct", 8));
        return list;
    }
}
EN

回答 1

Stack Overflow用户

发布于 2022-05-19 19:58:35

您的策划者缺少字段类型的参数。它返回void,但需要接受String类型的值。

字节Buddy有一种方便的方法。简单地添加:withProperty(fieldName, String.class)和一切都是正确的设置。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72261701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档