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

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

  •  25-08-2022
  •  | 
  •  

我是Java反思的新手。我试图称呼我的一种方法 DAO 使用反射的类,我得到了以下提到的非法参数异常错误。以下是我的代码。我的方法包含两个参数:一个是档案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;
}

我的请求的用户值是:: 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);       

假设的价值 requestedUsergetReviewerOneDetail, ,然后您会查找方法

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