2016-07-18 10 views
0

Я хочу написать функцию, которая при произвольном java-компоненте в качестве аргумента возвращает объект, являющийся копией этого компонента, но принадлежащий анонимному подклассу типа bean-типа, который содержит дополнительное имущество. Позвольте мне проиллюстрировать пример того, что я до сих пор:Добавить свойство в произвольный java 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), а не писать кучу отраженной магии.

Спасибо!

ответ

1

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