2015-06-29 122 views
1

我想在java中實現反射代碼。我是新來使用反射,我有一個這樣的現有方法:反射的setter,getter方法

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方法。有關如何使用反射調用這種方法的任何建議。

回答

2

你已經打電話給他們了!但只是錯誤的方式。 當你做m.invoke調用的方法,但你這樣做就像下面一行:

getIncomeFxResetSchedule(); 

如果你看這條線是什麼,你會想到什麼? Uuuhm,我想我錯過了可以節省價值的變量! Method.Invoke會返回一個Object,因此您需要將其轉換爲您的類。我猜你的班級是ScheduleParams

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

好吧,太好了。現在我想設置它。 再次,你調用接收PARAMS沒有經過任何PARAM的方法:

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,你會得到一個全新的對象。

我建議您閱讀以下相關問題:

和Oracle的關於反射API文檔。

+0

謝謝你,是有益的。 – user1658435

+0

不客氣! –