使用反射为Long类型字段赋值String类型属性值出错
  yj7FeyMm52DQ 2023年11月09日 38 0

背景

在进行项目的API开发时,需要将多个字段压缩放入一个字段中,减少对原有接口的影响。调整后,需要以反射形式为字段赋值,结果发现字段赋值时类型不匹配导致赋值失败。通过使用commons-beanutils.jar中的类型转换工具对字段类型进行转换可以解决这个问题。


错误代码

import com.alibaba.fastjson.JSON;
import org.apache.commons.beanutils.ConvertUtils;

import java.lang.reflect.Field;

public class FieldReflectTest {

    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        String value = "111";
        User user = new User();
        Field age = user.getClass().getDeclaredField("age");
        age.setAccessible(true);
        age.set(user,value);

    }
}

解决方案

pom.xml

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>fastjson</artifactId>
  <version>2.0.32</version>
</dependency>
<dependency>
  <groupId>commons-beanutils</groupId>
  <artifactId>commons-beanutils</artifactId>
  <version>1.9.4</version>
</dependency>


代码

User.java

public class User {

    private Long age;

    public Long getAge() {
        return age;
    }

    public void setAge(Long age) {
        this.age = age;
    }

    public User() {
    }
}

FieldReflectTest.java

public class FieldReflectTest {

    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        String value = "111";
        User user = new User();
        Field age = user.getClass().getDeclaredField("age");
        age.setAccessible(true);

        Class<?> type = age.getType();//获取字段的原始类型
        Object val = ConvertUtils.convert(value, type);//将String类型转换为Long类型。

        System.out.println("lll" + val);
        age.set(user,val);//为字段赋值
        System.out.println(JSON.toJSONString(user));
    }
}
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月09日 0

暂无评论

推荐阅读
  9J4CFPeHjrny   2023年12月24日   18   0   0 字段Java字段Java
  HQ5OKkp0Ip1J   2023年12月23日   96   0   0 ideUserpythonUseridePython
yj7FeyMm52DQ