Добавить свойство к произвольному 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 ответ
Я думаю, что в этом случае лучше использовать ткачество байт-кода во время выполнения, поскольку вам не нужно вызывать методы в вашей собственной кодовой базе.