setter,getter方法的反思

时间:2015-06-29 18:35:44

标签: java reflection

我正在尝试在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方法。关于如何使用反射调用这种方法的任何建议。

1 个答案:

答案 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文档。