我正在使用反射将字段的值从A类对象复制到B类对象。 但是A中的方法返回Number,其中B中的setter需要Long。有没有通用的方法我可以设置值。截至目前为止,我得到的是illegalArgumentException:参数类型不匹配
class a
{
Number value1;
Number value2;
public Number getValue1(){return value1;}
public Number getValue2(){return value2;}
}
class b
{
Double value1;
Long value2;
public void setValue1(Double value){this.value1 = value;}
public void setValue2(Long value){this.value2 = value;}
}
不确定我的问题是否不明确。
答案 0 :(得分:1)
你可以做到
b.setValue2(a.getValue2().longValue());
但如果a.value2
实际上不是整数(例如,它是带有小数分量的Double
),则会丢失数据。
相应地
b.setValue1(a.getValue1().doubleValue());
好的,我想我已经掌握了你的情况。这是一个肮脏的方式去做你想做的事情。基本上你需要有一个转换方法,它会根据所选的类将Number转换为另一个Number。你从Method
本身得到的那门课。所以它会是这样的:
public static void main(String[] args) throws Exception {
A a = new A();
a.setValue1(1.0);
a.setValue2(5);
B b = new B();
Method[] methods = b.getClass().getMethods();
for ( Method m : methods ) {
if ( m.getName().equals("setValue2") ) {
m.invoke(b, transform(a.getValue2(), m.getParameterTypes()[0]));
}
}
System.out.println(b.getValue2());
}
private static Number transform(Number n, Class<?> toClass) {
if ( toClass == Long.class ) {
return n.longValue();
} else if ( toClass == Double.class ) {
return n.doubleValue();
}
//instead of this you should handle the other cases exhaustively
return null;
}
您在上面获得IllegalArgumentException
的原因是因为a
,value2
未设置为Long
,因此将其设置为{ {1}}。它们是不相交的类型。如果Integer
实际上设置为Long,则不会出现该错误。
答案 1 :(得分:1)
您需要进行转换:
// get the Number 'number'
Long l = new Long(number.longValue());
// store the Long
使用自动装箱可以更有效地完成它。
答案 2 :(得分:0)
您无法以“通用”方式执行此操作,因为Number
可能是Float
,Byte
等。