java.lang.IllegalArgumentException:l'oggetto non è un'istanza di dichiarare la classe quando uso la riflessione

StackOverflow https://stackoverflow.com/questions/20353146

  •  25-08-2022
  •  | 
  •  

Domanda

Sono nuovo di Java riflessione.Ho provato a chiamare un metodo di mio DAO Classe utilizzando la riflessione, e ho ottenuto il seguente errore menzionato illegale eccezione di argomento.Di seguito è il mio codice.Il mio metodo contiene due argomenti:uno è il Fascicolo oggetto del fagiolo e un altro è sessionfactory oggetto.Ho ottenuto questo errore quando eseguo il mio metodo.Ho cercato molto in rete, ma non ha trovato la giusta soluzione.

public String getDossierDetail(HttpSession session,DoerDAO doerDao,SessionFactory sessionFactory,String requestedUser) throws ClassNotFoundException{
    log.info("(getDossierDetail)Execution starts");
    ReviewerOne reviewer = new ReviewerOne();
    String message = "";        
    DoerDAO doerDaoInt = new DoerDAO();
    try{
        List<Dossier> dossierDetail = (List<Dossier>) session.getAttribute(ObjectConstant.dossierDetailBean);
        System.out.println("dossierDetail: "+dossierDetail.size()+"product nm: "+dossierDetail.get(0).getProductName()+"requested User: "+requestedUser);
        Method method =  DoerDAO.class.getDeclaredMethod(requestedUser,Dossier.class,SessionFactory.class);         
         method.invoke(dossierDetail.get(0), sessionFactory);           
    }catch(Exception e){
        e.printStackTrace();
        log.error("(getDossierDetail)Error is: ",e);            
        message = e.getLocalizedMessage();
    }
    return message;
}

il mio requestedUser valore è:getReviewerOneDetail.

/** DoerDao metodo ********/

public void getReviewerOneDetail(Dossier dossierBean,SessionFactory sessionFactory){
    log.info("(getReviewerOneDetail)Execution starts.");



    try{

        System.out.println("in reviewer one detail....");

    }catch(Exception e){
        e.printStackTrace();
        log.error("(getReviewerOneDetail)Error is: ",e);
    }


}
È stato utile?

Soluzione

Versione breve:Ti manca il primo parametro nella chiamata a invoke.

Versione lunga:Si chiama

Method method = DoerDAO.class.getDeclaredMethod(requestedUser,
   Dossier.class,
   SessionFactory.class);       

Diciamo che il valore di requestedUser è getReviewerOneDetail, poi devi cercare il metodo

getReviewerOneDetail(Dossier arg0, SessionFactory arg1)

Il prossimo si chiama

method.invoke(dossierDetail.get(0), sessionFactory);

Il JavaDoc gli stati che richiamare ottiene come primo parametro l'istanza(!) della classe per chiamare il metodo e come seconda, terza, ...parametri i parametri per la vostra chiamata.

Così, che cosa è in realtà il tentativo di chiamata in codice, è

dossierDetail.get(0).getReviewerOneDetail(sessionFactory);

che non corrispondono la firma del metodo (1 parametro vs2 parametri), né il tipo di istanza su cui il metodo è invocato (Dossier invece di DoerDAO).

Perché si acquista il Method dal DoerDAO classe, credo che quello che è destinato a scrivere lì, era in realtà:

method.invoke(doerDao, dossierDetail.get(0), sessionFactory);

Questo si traduce in un

doerDao.getReviewerOneDetail(dossierDetail.get(0), sessionFactory);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top