如何将类声明字段名与对应值转换为Map<String, Double>?
问题分析与解决
你的代码主要有两个问题导致无法正确获取字段值:
- 类型强制转换错误:示例中的
vmax是long类型,Field.get()会返回Long对象,直接强转Double会抛出ClassCastException。 - 未处理非Double类型的数字字段:如果字段是其他数字类型(int、long、float等),直接强转都会出问题。
修改后的代码
import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; public class Converter { public Map<String, Double> convert(Object object) { Map<String, Double> parameters = new HashMap<>(); for (Field declaredField : object.getClass().getDeclaredFields()) { declaredField.setAccessible(true); try { Object value = declaredField.get(object); // 统一处理所有数字类型,转为Double if (value instanceof Number) { parameters.put(declaredField.getName(), ((Number) value).doubleValue()); } // 若需过滤非数字字段,可在此处添加跳过或异常抛出逻辑 } catch (IllegalAccessException e) { throw new RuntimeException("无法访问字段: " + declaredField.getName(), e); } } return parameters; } }
关键说明
- 用Number统一兼容数字类型:Java所有数字类型(基本类型及对应包装类)都实现了
Number接口,调用doubleValue()能安全将任意数字类型转为Double,不管是long、int还是float都能处理。 - 异常处理:
Field.get()会抛出IllegalAccessException,这里包装为RuntimeException抛出,你也可以根据业务需求改为自定义捕获逻辑。 - 可选字段过滤:如果只想处理指定类型的字段,比如仅处理double/long,可以额外判断字段类型:
Class<?> fieldType = declaredField.getType(); if (fieldType == double.class || fieldType == Double.class || fieldType == long.class || fieldType == Long.class) { // 执行转换逻辑 }
测试示例
public class Test { public static void main(String[] args) { Car car = new Car(); car.price = 100000.0; car.vmax = 200; Converter converter = new Converter(); Map<String, Double> result = converter.convert(car); System.out.println(result); // 输出 {price=100000.0, vmax=200.0} } } class Car { private double price; private long vmax; // 无需额外getter/setter,convert方法已通过setAccessible(true)绕过访问限制 }
内容的提问来源于stack exchange,提问作者Lulex97
相关产品推荐
相关产品推荐

