java.lang.illegalargumentException: l'objet n'est pas une instance de déclaration de classe lorsque j'utilise la réflexion

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

  •  25-08-2022
  •  | 
  •  

Question

Je suis nouveau dans la réflexion Java. J'ai essayé d'appeler une méthode de mon DAO Classe utilisant la réflexion, et j'ai obtenu l'exception de l'argument de l'argument illégal mentionné ci-dessous. Vous trouverez ci-dessous mon code. Ma méthode contient deux arguments: l'un est un objet de haricot de dossier et un autre est sessionfactory objet. J'ai eu cette erreur lorsque j'invoque ma méthode. J'ai cherché beaucoup sur le net mais je n'ai pas trouvé la bonne solution.

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;
}

Ma valeur demandée est :: getReviewerOneDeTail.

/** Méthode Doerdao ********/

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);
    }


}
Était-ce utile?

La solution

Version courte: vous manquez le premier argument de votre appel à invoke.

Version longue: vous appelez

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

Disons que la valeur de requestedUser est getReviewerOneDetail, alors tu rechercherais la méthode

getReviewerOneDetail(Dossier arg0, SessionFactory arg1)

Ensuite, vous appelez

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

La Javadoc Indique que l'invoque obtient le premier paramètre l'instance (!) De la classe pour appeler la méthode sur et comme deuxième, troisième, ... paramètres les paramètres réels pour votre invocation.

Donc, ce que vous essayez vraiment d'appeler dans votre code, c'est

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

qui ne correspond ni à la signature de la méthode (1 paramètre vs 2 paramètres), ni au type d'instance sur lequel la méthode est appelée (Dossier à la place de DoerDAO).

Parce que vous acquérez le Method du DoerDAO classe, je suppose que ce que vous aviez l'intention d'écrire là-bas, était en fait:

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

Cela se traduirait par

doerDao.getReviewerOneDetail(dossierDetail.get(0), sessionFactory);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top