java.lang.IllegalArgumentException : object is not an instance of declaring class when I use reflection 异常

标签 java reflection

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

我的 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指出 invoke 获取调用方法的类的实例 (!) 作为第一个参数,作为调用的实际参数作为第二个、第三个...参数。

那么,您实际尝试在代码中调用的是

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

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

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

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

这将转化为

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

关于java.lang.IllegalArgumentException : object is not an instance of declaring class when I use reflection 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20353146/

相关文章:

Java 正则表达式参数

Java项目查找非限定字符串引用的类--请求评论

java - 如何获取对象的类型以便可以将其与 instanceof 一起使用?

php - 如何进行 PHP StdClass 反射

java - 使用 this.getClass().getDeclaredField 方法时出现 NullPointerException

java - 创建文件名时,单引号在java中自动被两个单引号替换

java - 使用带有注解的MyBatis如果发生MySql错误则抛出自己的自定义异常

java - 在 Maven 中下载资源的 SSL 问题

java - flatMap 保证是惰性的吗?

swift - 获取 Swift 类的属性名称作为字符串