简短的回答没有。你所要求的是不可能的。反射在运行时查看代码并动态调用方法,它不能生成实际的方法。
你可以做什么是:
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