Добавить свойство к произвольному Java-бину

Я хочу написать функцию, которая, учитывая произвольный Java-бин в качестве аргумента, возвращает объект, который является копией этого бина, но принадлежит анонимному подклассу типа бина, который содержит дополнительное свойство. Позвольте мне проиллюстрировать на примере того, что я имею до сих пор:

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);
}

Вот где я застрял. Я не знаю, чтобы скопировать все свойства из данного объекта в мой новый объект. У кого-нибудь есть идеи? В идеале было бы то, что я мог бы сделать, используя ломбок (я контролирую Foo класс и может добавлять аннотации, такие как @Builder в случае необходимости) вместо того, чтобы самому написать кучу отражающей магии.

Спасибо!

1 ответ

Я думаю, что в этом случае лучше использовать ткачество байт-кода во время выполнения, поскольку вам не нужно вызывать методы в вашей собственной кодовой базе.

Другие вопросы по тегам