java.lang.illegalargumentexception: الكائن ليس مثيلًا لإعلان الفصل عند استخدام التفكير

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

  •  25-08-2022
  •  | 
  •  

سؤال

أنا جديد على انعكاس جافا. حاولت أن أسمي طريقة واحدة من بلدي DAO الفصل باستخدام التفكير ، وحصلت على الخطأ المذكور أدناه لاستثناء الحجة غير القانوني. أدناه هو الكود الخاص بي. تحتوي طريقتي على وسيطتين: أحدهما كائن حبوب الملف والآخر 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;
}

القيمة الخاصة بي هي :: getReviewerOnEdetail.

/** طريقة 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);

ال جافادوك ينص على أن الاستدعاء يحصل على المعلمة الأولى على المثيل (!) للفئة لاستدعاء الطريقة والثانية ، والثالثة ، ... المعلمات المعلمات الفعلية لاستدعاءك.

لذا ، ما تحاول الاتصال به في الكود الخاص بك ، هو

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