【问题标题】:Add property to arbitrary java bean将属性添加到任意 java bean
【发布时间】:2016-07-18 18:56:31
【问题描述】:

我想编写一个函数,给定一个任意的 java bean 作为参数,返回一个对象,该对象是该 bean 的副本,但属于该 bean 类型的包含附加属性的匿名子类。让我用一个例子来说明我目前所拥有的:

Foo.java:

import lombok.Data;
import lombol.AllArgsConstructor;

@Data
@AllArgsConstructor
public class Foo {
    private String bar;
    private String baz;
}

Garply.java:

public class Garply {
    Foo fooWithQux(Foo foo, String quxVal) {
        return new Foo(foo.bar, foo.baz) {
            private String qux;

            public String getQux() {
                return quxVal;
            }
        };
    }
}

这看起来很愚蠢,因为我永远无法真正调用getQux(),但我使用的一个工具使用反射成功找到qux 属性并用它做我想做的事。

我的问题是,我不想为每种类型使用单独的 fooWithQux() 函数,我希望能够将 qux 属性添加到其中。理想情况下,我会有类似beanWithQux() 的东西,它接受任意类型的对象。我想我可以通过以下方式完成这项工作:

public T beanWithQux<T>(T bean, String quxVal) {
    class BeanWithQux extends T {
        private String qux;

        BeanWithQux(T bean, String quxVal) {
            // Here's where I'd like to copy all of the properties
            // from the Bean into the BeanWithQux

            qux = quxVal;
        }

        public getQux() {
            return qux;
        }
    }

    return BeanWithQux(bean, quxVal);
}

这就是我卡住的地方。我不知道将给定对象中的所有属性复制到我的新对象中。有人有想法吗?理想情况下,我可以使用 lombok 做一些事情(我控制 Foo 类,如果需要可以添加 @Builder 之类的注释),而不是自己编写一堆反射魔法。

谢谢!

【问题讨论】:

    标签: java javabeans lombok anonymous-inner-class local-class


    【解决方案1】:

    我认为在这种情况下使用runtime bytecode weaving 是一种更好的方法,因为您不需要在自己的代码库中调用这些方法。

    【讨论】:

      猜你喜欢
      • 2021-10-26
      • 2021-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 2023-01-20
      相关资源
      最近更新 更多