作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我是 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/
我是一名优秀的程序员,十分优秀!