java.lang.illegalargumentException: el objeto no es una instancia de la clase de declaración cuando uso la reflexión

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

  •  25-08-2022
  •  | 
  •  

Pregunta

Soy nuevo en Java Reflection. Traté de llamar a un método de mi DAO Clase usando la reflexión, y obtuve el siguiente error mencionado de excepción de argumentos ilegales. A continuación se muestra mi código. Mi método contiene dos argumentos: uno es el objeto de frijol dossier y otro es sessionfactory objeto. Recibí este error cuando invoco mi método. Busqué en lote en la red pero no encontré la solución adecuada.

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

Mi valor de SolicedUser es :: getRevieweredetail.

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


}
¿Fue útil?

Solución

Versión corta: te estás perdiendo el primer argumento en tu llamado a invoke.

Versión larga: estás llamando

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

Digamos que el valor de requestedUser es getReviewerOneDetail, entonces buscarías el método

getReviewerOneDetail(Dossier arg0, SessionFactory arg1)

Siguiente llamas

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

los Javadoc establece que Invoke obtiene como primer parámetro la instancia (!) de la clase para llamar al método y como segundo, tercero, ... parámetros de los parámetros reales para su invocación.

Entonces, lo que realmente intenta llamar en su código es

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

que no coincide con la firma del método (1 parámetro frente a 2 parámetros), ni el tipo de instancia en el que se llama el método (Dossier en vez de DoerDAO).

Porque adquieres el Method desde el DoerDAO clase, supongo que lo que pretendía escribir allí, fue en realidad:

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

Esto se traduciría a

doerDao.getReviewerOneDetail(dossierDetail.get(0), sessionFactory);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top