@Data注解在Boolean类型属性上的大坑

@Data注解在Boolean类型属性上的大坑

直接看总结吧

问题描述

将A类的值拷贝到B类,且A类中多余的属性存放到B类的extraElement属性中;
发现问题: Boolean属性的字段没有完成拷贝

具体描述信息:

类A:

@Data
public class A {
    private String id;
    private String name;
    private boolean sex;
}

类B

@Data
public class B {
    private String id;
    private String extraElement;
}

拷贝的代码

	public static void main(String[] args) {
		A a = new A();
		a.setId(Pub.getUUID());
		a.setSex(true);
		a.setName("test");
		B b = new B();
		ToolBeans.copyPropertiesToExtra( a, b, "extraElement" );
		System.out.println(a);
		System.out.println(b);
		System.out.println(b.getExtraElement());
	}
	public static <F, T> void copyPropertiesToExtra( F from, T to, String extra )
	{
		MethodAccess fromMethodAccess = get( from.getClass() );
		MethodAccess toMethodAccess = get( to.getClass() );
		Field[] fromDeclaredFields = from.getClass().getDeclaredFields(); // 获取来源的字段
		JSONObject extraJson = new JSONObject();

		for ( Field field : fromDeclaredFields )
		{
			String name = field.getName();
			Object value = null;
			try
			{
				value = fromMethodAccess.invoke( from, "get" + StringUtils.capitalize( name ), null );
				toMethodAccess.invoke( to, "set" + StringUtils.capitalize( name ), value );
			}
			catch ( Exception e )
			{
				// 设置异常,可能会没有对应字段,忽略
				extraJson.put( name, value );
			}
		}
		try
		{
			toMethodAccess.invoke( to, "set" + StringUtils.capitalize( extra ), extraJson.toJSONString() );
		}
		catch ( Exception e )
		{
			log.error( "将数据放置到扩展字段失败", e );
		}

	}

结果:

在这里插入图片描述
可以明显看到id属性已经拷贝成功,多余的属性name和sex name已经进入了extraElement中,唯独sex没有拷贝成功

发现原因

通过追源码后发现
在这里插入图片描述
对于Boolean类型的数据, @Data给到的get方法名默认为isSex而不是getSex

问题解决

手动添加get方法,覆盖掉@Data注解的方法
在这里插入图片描述
再次运行:
在这里插入图片描述
问题解决!

问题总结

添加@Data注解时, 如果有boolean属性的数据,且属性的名字还不是is开头的,则默认的get方法就会把is给加上

场景1:

boolean sex;
在加上@Data注解后得到的get set方法为
在这里插入图片描述
set方法正常但get方法是 isSex() 而不是 getSex()

场景二

如果已经有了is则就是正常形式了:
boolean isGirl;
在加上@Data注解后得到的get,set方法为
getIsGirl()
get方法为isGirl() 而不是getIsGirl()
set方法为setGirl 而不是setIsGirl()

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值