开发者

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

目录
  • @Data注解在Boolean类型属性上的大坑
    • 问题描述
      • 具体描述信息
      • 结果
    • 发现原因
      • 问题解决
      • 问题总结
        • 场景1
          • 场景2

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

          直接看总结吧

          问题描述

          将A类的值拷贝到B类,且A类中多余的属性存放到B类的extraElement属性中;

          发现问题:Boolean属性的字段没有完成拷贝

          具体描述信息

          • 类A:
          @Data
          public javascriptclass A {
              private String id;
              private String name;
              private boolean sex;
          }
          • 类B:
          @Data
          public class B {
              private Stringandroid 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();
          		ToolBe编程ans.copyPropertiesToExtra( a, b, "extraElement" );
          		System.ouwww.devze.comt.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().getDeclaredFiwww.devze.comelds(); // 获取来源的字段
          		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 );
          		}
          
          	}
          

          结果

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

          可以明显看到id属性已经拷贝成功,多余的属性name和sex name已经进入了extraElement中,唯独sex没有拷贝成功

          发现原因

          通过追源码后发现

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

          对于Boolean类型的数据, @Data给到的get方法名默认为isSex而不是getSex

          问题解决

          手动添加get方法,覆盖掉@Data注解的方法

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

          再次运行:

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

          问题解决!

          问题总结

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

          场景1

          boolean sex;

          在加上@Data注解后得到的get set方法为

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

          set方法正常但get方法是 isSex() 而不是 getSex()

          场景2

          如果已经有了is则就是正常形式了:

          boolean isGirl;

          在加上@Data注解后得到的get,set方法为

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

          • get方法为isGirl() 而不是getIsGirl()
          • set方法为setGirl 而不是setIsGirl()

          以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

          0

          上一篇:

          下一篇:

          精彩评论

          暂无评论...
          验证码 换一张
          取 消

          最新开发

          开发排行榜