我正在尝试在java中实现反射代码。我是新手使用反射,我有一个像这样的现有方法:
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));
}
我正在尝试为上面的代码编写反射代码,而我现在陷入困境:
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
}
但我不知道如何调用setter方法和getter方法。关于如何使用反射调用这种方法的任何建议。
答案 0 :(得分:2)
你已经在打电话了!但只是以错误的方式。
当您执行m.invoke
时,调用方法,但您执行此操作的方式如下:
getIncomeFxResetSchedule();
如果你看到那条线,你会怎么想? Uuuhm,我想我错过了我将保存价值的变量! Method.Invoke
会返回一个Object,因此您需要将其强制转换为您的类。我猜你的班级是ScheduleParams
。
ScheduleParams scheduleParams = (ScheduleParams) m.invoke(performanceSwapLeg);
好的,太好了。现在我想设置它。 再次,你正在调用一个接收参数而不通过任何参数的方法:
Method m1 = ScheduleParams.class.getMethod("setDateRoll", dateRoll);
m1.invoke(performanceSwapLeg);
如下所示:
setDateRoll();
那可能是在抛出一个
java.lang.IllegalArgumentException: wrong number of arguments
因为你没有被称为不带参数的方法(我希望如此),现在正确的方法应该是:
Method m1 = ScheduleParams.class.getMethod("setDateRoll", dateRoll);
m1.invoke(performanceSwapLeg, new DateRoll());
之后,您可以再次调用getter,然后您将获得一个全新的对象。
我建议您阅读以下相关问题:
关于反射api的Oracle文档。