簡短的回答沒有。你所要求的是不可能的。反射在運行時查看代碼並動態調用方法,它不能生成實際的方法。
你可以做什麼是:
Foo foo = ReflectiveBuilder.from(Foo.class).
set("id", 1).
set("title", "title").
build();
這有三個大規模問題:
- 字段是
String
秒 - 一個錯字導致運行時錯誤而不是編譯時一個,
- 值爲
Object
s - 錯誤類型會導致運行時錯誤,而不是編譯時錯誤,並且
- 由於反射非常緩慢,所以它會比替代方法慢得多。
因此,雖然可能的基於反射的解決方案(請參閱Apache Commons BeanUtils BeanMap
)並不實際。
很長的回答,如果你願意允許一些編譯時魔術,你可以使用Project Lombok。 Lombok背後的想法是使用Java註釋預處理器系統從註釋生成樣板代碼。
真正神奇的是,至少所有的IDE,至少大3,理解註釋預處理和代碼完成仍然會正常工作,即使代碼真的存在。
在一個POJO
與Builder
可以使用@Data
的情況和@Builder
@Data
@Builder
public class Foo {
public int id;
public String title;
public boolean change;
...
}
的@Data
註釋將產生:
的@Builder
註釋會產生稱爲Builder
可以使用Foo.builder()
被實例化的內部類。
請確保您配置equals
,hashCode
和toString
方法,如果你有兩個班,龍目島有相互之間的引用,那麼你最終會在默認情況下,一個無限循環既是類包括其他的這些方法。
還有一個新的configuration system,使您可以使用,例如,流利的制定者,所以你可以更減配建築商做的路程,如果你的POJO是可變的:
new Foo().setId(3).setTitle("title)...
對於另一種方法,您可以看看Aspect-oriented programming(AOP)和AspectJ。 AOP允許你將類切成「方面」,然後使用預編譯器使用某些規則將它們粘在一起。例如,您可以使用自定義註釋和一個方面來實現Lombok所做的。然而,這是一個相當先進的話題,而且可能是過度的。
你是否使用Apache commons forString hashCode並等於?這仍然很痛苦,但會爲你節省很多時間。你的代碼有一個基礎類,它反射地做了toString,equals和hashCode然後從我的 – Leon 2014-09-23 07:18:10
@Leon派生所有POJO,實際上。但是每個班級仍然最終會有70-100行代碼來自每個構建者。必須有一個更好的模式,我只是沒有意識到或者實現反射式生成器的方式,至少這是我的感受。 – buildpattern 2014-09-23 07:21:16