java.lang.IllegalArgumentException:当我使用反射时,object不是声明类的实例

Pra*_*shi 3 java reflection

我是Java反思的新手.我尝试DAO使用反射调用我的类的一个方法,并且我得到了下面提到的非法参数异常的错误.以下是我的代码.我的方法包含两个参数:一个是Dossier bean对象,另一个是sessionfactoryobject.当我调用我的方法时,我收到此错误.我在网上搜索了很多但没有找到合适的解决方案.

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;
}
Run Code Online (Sandbox Code Playgroud)

我的requestedUser值是:: 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);
    }


}
Run Code Online (Sandbox Code Playgroud)

Ste*_*ler 5

简短版本:您缺少调用中的第一个参数invoke.

长版:你在打电话

Method method = DoerDAO.class.getDeclaredMethod(requestedUser,
   Dossier.class,
   SessionFactory.class);       
Run Code Online (Sandbox Code Playgroud)

假设的价值requestedUser就是getReviewerOneDetail,那么你查找方法

getReviewerOneDetail(Dossier arg0, SessionFactory arg1)
Run Code Online (Sandbox Code Playgroud)

接下来你打电话

method.invoke(dossierDetail.get(0), sessionFactory);
Run Code Online (Sandbox Code Playgroud)

JavaDoc中来调用状态得到作为第一个参数实例(!)之类的调用方法上,并作为第二,第三,...参数为您调用的实际参数.

那么,你实际上试图在你的代码中调用的是,

dossierDetail.get(0).getReviewerOneDetail(sessionFactory);
Run Code Online (Sandbox Code Playgroud)

它既不匹配方法签名(1个参数与2个参数),也不匹配调用方法的实例类型(Dossier而不是DoerDAO).

因为你MethodDoerDAO课堂上获得了,我想你打算在那里写的是,实际上:

method.invoke(doerDao, dossierDetail.get(0), sessionFactory);
Run Code Online (Sandbox Code Playgroud)

这将转化为

doerDao.getReviewerOneDetail(dossierDetail.get(0), sessionFactory);
Run Code Online (Sandbox Code Playgroud)