开发者

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

开发者 https://www.devze.com 2024-10-29 10:35 出处:网络 作者: 学习使得吾快乐
目录@Data注解在Boolean类型属性上的大坑问题描述具体描述信息结果发现原因问题解决问题总结场景1场景2@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

          精彩评论

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

          关注公众号