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

我是Java反思的新手。 我尝试使用reflection调用我的DAO类的一个方法,并且我得到了下面提到的非法参数exception的错误。 以下是我的代码。 我的方法包含两个参数:一个是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 dossierDetail = (List) 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; } 

我的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); } } 

简短版本:您缺少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 )。

因为你从DoerDAO类中获取了Method ,我想你打算在那里写的是,实际上:

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

这将转化为

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