wen*_*ner 8 java reflection chaining lombok apache-commons-beanutils
例如
class tester
{
@Test
public void testBeanUtils() throws InvocationTargetException, IllegalAccessException, NoSuchMethodException
{
Stranger stranger = new Stranger();
BeanUtils.setProperty(stranger,"name","wener");
BeanUtils.setProperty(stranger,"xname","xwener");
BeanUtils.setProperty(stranger,"yname","ywener");
System.out.println(stranger);
}
@Data// lombok annotation generate all setter and getter
public static class Stranger
{
@Accessors(chain = true)// generate chained setter
String name;
String xname;
String yname;
public Stranger setYname(String yname)// no lombok, still not work
{
this.yname = yname;
return this;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的输出:
TestValues.Stranger(name=null, xname=xwener, yname=null)
Run Code Online (Sandbox Code Playgroud)
这有什么问题?连锁二传手是一件好事.有什么建议?
编辑
再次回到这个问题.这次我无法删除Accessors chain.现在,我commons-lang3用来实现.
// force access = true is required
Field field = FieldUtils.getField(bean.getClass(), attrName, true);
field.set(bean,value);
Run Code Online (Sandbox Code Playgroud)
对于那些遇到同样问题的人.
小智 12
您可以使用FluentPropertyBeanIntrospector实现:
"BeanIntrospector接口的一个实现,它可以检测在流畅的API场景中使用的属性的写入方法."
PropertyUtils.addBeanIntrospector(new FluentPropertyBeanIntrospector());
BeanUtils.setProperty( this.o, "property", "value" );
Run Code Online (Sandbox Code Playgroud)
很简单:BeanUtils很奇怪,所以Introspector它使用:
尽管BeanUtils.setProperty声明了一些异常,但它似乎默默地忽略了要设置的属性的不存在。最终的罪魁祸首就是Introspector仅仅需要二传手的虚无。
我称其为设计破坏,但YMMV。这是一个古老的类,在那个黑暗的时代还没有发明流畅的界面。使用Accessors(chain=false)以禁用链接。
更重要的是:使用来源。获取它并获取调试器(它已经在您的IDE中)可以自己找到它(仍然可以询问它是否不起作用,请再努力一点)。
| 归档时间: |
|
| 查看次数: |
1735 次 |
| 最近记录: |