java.lang.illegalargumentException: Objeto não é uma instância de declaração de classe quando eu uso a reflexão

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

  •  25-08-2022
  •  | 
  •  

Pergunta

Eu sou novo na reflexão de Java. Eu tentei chamar um método do meu DAO Classe usando reflexão e recebi o erro abaixo mencionado da exceção de argumentos ilegais. Abaixo está o meu código. Meu método contém dois argumentos: um é o objeto de bean dossiê e outro é sessionfactory objeto. Recebi esse erro quando invoco meu método. Eu procurei lote na rede, mas não encontrei a solução adequada.

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

Meu valor solicitado é :: getReviewerOnedEtail.

/** Método 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);
    }


}
Foi útil?

Solução

Versão curta: você está perdendo o primeiro argumento em sua chamada para invoke.

Versão longa: você está ligando

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

Digamos que o valor de requestedUser é getReviewerOneDetail, então você procuraria o método

getReviewerOneDetail(Dossier arg0, SessionFactory arg1)

Em seguida, você liga

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

o Javadoc Estados que invocam o primeiro parâmetro da instância (!) da classe para chamar o método e, como segundo, terceiro, ... parâmetros os parâmetros reais para sua invocação.

Então, o que você realmente tentando chamar em seu código é

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

que não corresponde à assinatura do método (1 parâmetro vs. 2 parâmetros), nem o tipo de instância no qual o método é chamado (Dossier ao invés de DoerDAO).

Porque você adquire o Method de DoerDAO Aula, eu acho que o que você pretendia escrever lá foi realmente:

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

Isso se traduziria em

doerDao.getReviewerOneDetail(dossierDetail.get(0), sessionFactory);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top