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

java.lang.IllegalArgumentException:当我使用反射时,对象不是声明类的实例,java,reflection,Java,Reflection,我不熟悉Java反射。我尝试使用反射调用我的DAO类的一个方法,得到了下面提到的非法参数异常错误。下面是我的代码。我的方法包含两个参数:一个是dossierbean对象,另一个是sessionfactory对象。我在调用我的方法时遇到了这个错误。我在网上搜索了很多,但没有找到合适的解决方案 public String getDossierDetail(HttpSession session,DoerDAO doerDao,SessionFactory sessionFactory,String

我不熟悉Java反射。我尝试使用反射调用我的
DAO
类的一个方法,得到了下面提到的非法参数异常错误。下面是我的代码。我的方法包含两个参数:一个是dossierbean对象,另一个是
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;
}

简短版本:调用
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个参数),也不匹配调用该方法的实例类型(
docsier
而不是
DoerDAO

因为您从
DoerDAO
类中获得了
方法
,我猜您打算在那里写的实际上是:

method.invoke(doerDao, dossierDetail.get(0), sessionFactory);
这将转化为

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

这听起来像是为什么要使用反射来调用方法?你想解决的更大的任务是什么?为什么你不能使用一个普通的方法调用?你能显示异常以及它发生在哪一行吗?兄弟,我有很多方法可以使用方法名调用。但我被困在第一次祈祷中。所以,如果这个get-solve,我将添加更多的方法。@treeno::当我调用我的method.method.invoke(dossierDetail.get(0),sessionFactory)时,就会发生这种情况@PratikJoshi行
System.out.println(“dossierDetail:+dossierDetail.size()+”产品nm:+dossierDetail.get(0).getProductName()+”请求的用户:+requestedUser)的输出是什么兄弟你是冠军。。。从早上开始我就一直在寻找解决办法。伟大的工人。
doerDao.getReviewerOneDetail(dossierDetail.get(0), sessionFactory);