1

I am trying to implement reflection code in java. I am new to using reflections and I have an existing method like this:

ScheduleParams incomeResetFXSchedule = performanceSwapLeg.getIncomeFxResetSchedule();
    if (performanceSwapLeg.getIncomeFxResetSchedule().getDateRoll() != null) {
        incomeResetFXSchedule.setDateRoll(DateRoll.valueOf(performanceSwapLeg.getIncomeFxResetSchedule().getDateRoll().toString()));
    } else {
        incomeResetFXSchedule.setDateRoll(DateRoll.valueOf(DateRoll.S_PRECEDING));
    }

I was trying to write reflection code for the above code and I am stuck at this point:

 try {
        Class<ScheduleParams> incomeFXResetSchedule = ScheduleParams.class;
        Class<DateRoll> dateRoll = DateRoll.class;
        try {
            Method m = PerformanceSwapLeg.class.getMethod("getIncomeFxResetSchedule");
            m.invoke(performanceSwapLeg);
            Method m1 = ScheduleParams.class.getMethod("setDateRoll", dateRoll);
            m1.invoke(performanceSwapLeg);
        } catch (Exception e) {
            Log.error(CommonConstants.ERROR_LOG, "Failed to invoke the method" + e.getMessage());
        }
    } catch (Exception e) {
   //Do Nothing
    }

But I am not sure how to call the setter method and the getter method. Any suggestions on how to call this kind of methods using reflections.

Madhan
  • 5,750
  • 4
  • 28
  • 61
user1658435
  • 574
  • 1
  • 9
  • 28

1 Answers1

2

You are already calling 'em! But just in the wrong way. When you do m.invoke you're calling the method, but you're doing it like the following line:

getIncomeFxResetSchedule();

If you watch that line what you'll think? Uuuhm, I think I missed the variable where I'll save the value! Method.Invoke returns an Object, thus you'll need to cast it to your class. I guess your class is ScheduleParams.

ScheduleParams scheduleParams = (ScheduleParams) m.invoke(performanceSwapLeg);

Okay, great. Now I want to set it. Once again, you're calling a method which receives params without passing any param:

Method m1 = ScheduleParams.class.getMethod("setDateRoll", dateRoll);
m1.invoke(performanceSwapLeg);

It's like the following line:

setDateRoll();

That is probably throwing an

java.lang.IllegalArgumentException: wrong number of arguments

Because you have no method called like that which takes no arguments (I hope so), now the right way should be:

 Method m1 = ScheduleParams.class.getMethod("setDateRoll", dateRoll);
 m1.invoke(performanceSwapLeg, new DateRoll());

After that you could call the getter again and you'll get a whole new object.

I recommend you to read the following related question:

And the Oracle's documentation about reflection api.

Community
  • 1
  • 1
Yayotrón
  • 1,759
  • 16
  • 27