java.lang.illegalargumentException: объект не является экземпляром объявления класса, когда я использую отражение

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

  •  25-08-2022
  •  | 
  •  

Вопрос

Я новичок в Java Reflection. Я попытался назвать один метод моего DAO Класс, используя отражение, и я получил приведенную ниже ошибку исключения незаконного аргумента. Ниже мой код. Мой метод содержит два аргумента: один - объект Dossier Bean, а другой - sessionfactory объект. Я получил эту ошибку, когда я вызывал свой метод. Я искал много в сети, но не нашел правильного решения.

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

Мое значение для запроса обучения :: getReviewerOneTail.

/** Метод 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);
    }


}
Это было полезно?

Решение

Короткая версия: вам не хватает первого аргумента в своем вызове invoke.

Длинная версия: вы звоните

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

Допустим, что ценность requestedUser является getReviewerOneDetail, тогда вы посмотрите на метод

getReviewerOneDetail(Dossier arg0, SessionFactory arg1)

Далее вы звоните

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

А Javadoc Состояния, которые вызывают, получают как первым параметрам экземпляр (!) Класса, чтобы вызвать метод включенным и как второе, третье, ... параметры фактические параметры для вашего вызова.

Итак, то, что вы на самом деле пытаетесь позвонить в свой код, это

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

который не соответствует сигнатуру метода (1 параметр против 2 параметров), ни тип экземпляра, на котором вызывается метод (Dossier вместо DoerDAO).

Потому что вы приобретаете Method от DoerDAO Класс, я думаю, что вы намеревались написать там, на самом деле:

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

Это приведет к

doerDao.getReviewerOneDetail(dossierDetail.get(0), sessionFactory);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top