java - 向任意 java bean 添加属性

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

我想编写一个函数,给定任意 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 属性并执行我想要的操作它。

我的问题是,我不想为我希望能够添加 qux 属性的每种类型拥有单独的 fooWithQux() 函数。理想情况下,我应该有像 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 这样的注释),而不是编写一堆反射魔法我自己。

谢谢!

最佳答案

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

关于java - 向任意 java bean 添加属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38444090/

相关文章:

java - java中使用子字符串和索引的范围错误

java - 使用引导类加载器找不到类

java - 用于计算 ArrayList 中重复项的嵌套循环无法正常工作

具有可选返回类型的 JavaBean 自省(introspection)

java - Spring Beans Mule - 接口(interface)/类类型的属性

java - 使用 java 8 stream api 做数组列表的深层复制但得到构建时间错误

java - lombok 调用默认构建器的子类函数

java - @TestPropertySource(properties = {"ticketing.profile=test"}) 是否应该自动更新系统属性值?

java - 何时使用 Java Bean 以及何时使用 Enterprise Java Bean

java - 将 Java Lombok 集成到 Bitbucket 管道中