开发者

problem faced while setting value using reflection

开发者 https://www.devze.com 2023-01-30 07:02 出处:网络
i am using reflection to copy values of fields from object of Class A to object of开发者_StackOverflow中文版 Class B.

i am using reflection to copy values of fields from object of Class A to object of开发者_StackOverflow中文版 Class B. However method in A returns Number, where as setter in B requires Long. Is there any generic way i could set the value. As of now as expected i get illegalArgumentException: argument type mismatch

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;}

}

Not sure if my question is unclear.


You could do

b.setValue2(a.getValue2().longValue());

But if a.value2 isn't actually an integer (e.g. it's a Double with a fractional component) this will lose data.

Correspondingly

b.setValue1(a.getValue1().doubleValue());

Edit

Ok I think I've got a grasp on your situation. Here's a dirty way to go about what you want to do. Basically you need to have a transform method which will transform a Number into another Number based on a chosen class. That class you get from the Method itself. So it will be something like this:

   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;
   }

The reason you would otherwise get an IllegalArgumentException in the above is because with a, value2 is not being set to a Long, it's being set to an Integer. They are disjoint types. If a.value2 was actually set to be a Long instead, you wouldn't have that error.


You need to do the conversion:

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

You could do it even more efficiently using autoboxing.


You can't do this in a 'generic' way, because a Number could be a Float, Byte etc.

0

精彩评论

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