java.lang.IllegalArgumentException:当我使用反射时,object不是声明类的实例 [英] java.lang.IllegalArgumentException: object is not an instance of declaring class when I use reflection

查看:1288
本文介绍了java.lang.IllegalArgumentException:当我使用反射时,object不是声明类的实例的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am new to Java reflection. I tried to call one method of my DAO Class using reflection, and I got the below mentioned error of illegal argument exception. Below is my code. My method contains two arguments: one is Dossier bean object and another is sessionfactory object. I got this error when I invoke my method. I searched lot on net but did not find the proper solution.

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。

my requestedUser value is :: getReviewerOneDetail.

/ * * DoerDao方法 * ** * *** * /

/** DoerDao method ********/

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


}


推荐答案

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

Short version: You are missing the first argument in your call to invoke.

长版:您正在致电

Method method = DoerDAO.class.getDeclaredMethod(requestedUser,
   Dossier.class,
   SessionFactory.class);       

假设 requestedUser 的值是 getReviewerOneDetail ,然后你会查找方法

Let's say that the value of requestedUser is getReviewerOneDetail, then you'd look up the method

getReviewerOneDetail(Dossier arg0, SessionFactory arg1)

接下来你打电话

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

JavaDoc 声明调用获取实例的第一个参数(! )调用方法的类和第二个,第三个,...参数调用的实际参数。

The JavaDoc states that invoke gets as first parameter the instance(!) of the class to call the method on and as second, third, ... parameters the actual parameters for your invocation.

那么,你实际上想要调用的是什么你的代码是

So, what you actually trying to call in your code, is

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

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

which does neither match the method signature (1 parameter vs. 2 parameters), nor the instance type on which the method is called (Dossier instead of DoerDAO).

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

Because you acquire the Method from the DoerDAO class, I guess what you intended to write there, was actually:

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

这将转化为

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

这篇关于java.lang.IllegalArgumentException:当我使用反射时,object不是声明类的实例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆