使用反射设置值时遇到的问题

时间:2010-12-09 17:05:11

标签: java

我正在使用反射将字段的值从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;}

}

不确定我的问题是否不明确。

3 个答案:

答案 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的原因是因为avalue2未设置为Long,因此将其设置为{ {1}}。它们是不相交的类型。如果Integer实际上设置为Long,则不会出现该错误。

答案 1 :(得分:1)

您需要进行转换:

// get the Number 'number'
Long l = new Long(number.longValue());
// store the Long

使用自动装箱可以更有效地完成它。

答案 2 :(得分:0)

您无法以“通用”方式执行此操作,因为Number可能是FloatByte等。