2013-04-05 84 views
2

下調用一個方法是我的方法,我試圖在Java中使用反射調用的方法:無法通過反射

@PreAuthorize("isAuthenticated() and hasPermission(#request, 'CREATE_REQUISITION')") 
    @RequestMapping(method = RequestMethod.POST, value = "/trade/createrequisition") 
    public @ResponseBody 
    void createRequisition(@RequestBody CreateRequisitionRO[] request, 
      @RequestHeader("validateOnly") boolean validateOnly) { 
     logger.debug("Starting createRequisition()..."); 
     for (int i = 0; i < request.length; i++) { 
      CreateRequisitionRO requisitionRequest = request[i]; 

      // FIXME this has to be removed/moved 
      requisitionRequest.setFundManager(requisitionRequest.getUserId()); 
      // FIXME might have to search using param level as well 
      SystemDefault sysDefault = dbFuncs.references.systemDefault 
        .findByCompanyAndDivisionAndPortfolio(
          userContext.getCompany(), 
          userContext.getDivision(), 
          requisitionRequest.getPortfolio()); 
      requisitionRequest.setCustodianN(sysDefault.getCustodianN()); 

      gateKeeper.route(requisitionRequest); 
     } 
    } 

我創造的反思方式:

public static void main(String[] args) { 
     Class[] paramString = new Class[1]; 
     paramString[0] = String.class; 

     //Object parameter 
     Class[] parames = new Class[1]; 
     parames[0] = CreateRequisitionRO.class; 

     Class booleanVal ; 
     booleanVal = Boolean.class; 


     Class cls; 
     CreateRequisitionRO[] request = new CreateRequisitionRO[10]; 
     try { 
      //load the HexgenWebAPI at runtime 
      cls = Class.forName("com.hexgen.api.facade.HexgenWebAPI"); 
      Object obj = cls.newInstance(); 

      Method method = cls.getDeclaredMethod("createRequisition", parames,booleanVal); 
      method.invoke(obj, request,true); 


     }catch(Exception ex){ 
      ex.printStackTrace(); 
     } 

    } 

我得到但以下情況除外:

The method getDeclaredMethod(String, Class...) in the type Class is not applicable for the arguments (String, Class[], Class) 

在以下行

Method method = cls.getDeclaredMethod(「createRequisition」,parames,booleanVal);

我明白這個異常,但我的方法參數是對象數組。如果我刪除陣列比我得到NoSuchMethod Exception

如何解決這個問題?

回答

2

您必須通過一類CreateRequisitionRO數組,而不是類陣列的:代替此

Class[] parames = new Class[1]; 
parames[0] = CreateRequisitionRO.class; 

與此:

Class parames = CreateRequisitionRO[].class; 

此外,由於第二個參數是boolean,不是Boolean,您需要更換

booleanVal = Boolean.class; // The class of the wrapper Boolean 

booleanVal = Boolean.TYPE; // The class of the primitive boolean 
+0

偉大的觀察,它解決了編譯時問題。但我現在得到這個'java.lang.reflect.InvocationTargetException'。你能指導我嗎?同時我會接受這個答覆與upvote。 :) – 2013-04-05 10:06:56

+0

@Anto'InvocationTargetException'意味着該方法的實現拋出一個錯誤。抓住你的代碼,調用'getCause()',看看你的例外的真正原因是什麼。此時,問題將出現在帖子頂部的段中,或者在您從'newInstance()'調用的默認構造函數中。 – dasblinkenlight 2013-04-05 10:25:36