java.lang.illegalargumentexception:オブジェクトは、リフレクションを使用するときにクラスを宣言するインスタンスではありません

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

  •  25-08-2022
  •  | 
  •  

質問

私はJava Reflectionに慣れています。私は自分の1つの方法を呼び出そうとしました DAO リフレクションを使用したクラス、そして以下の違法な引数の例外のエラーを取得しました。以下は私のコードです。私の方法には2つの引数が含まれています。1つはdossier beanオブジェクトで、もう1つは 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);       

の価値があるとしましょう requestedUsergetReviewerOneDetail, 、次に、メソッドを調べます

getReviewerOneDetail(Dossier arg0, SessionFactory arg1)

次に電話します

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

Javadoc Invokeが最初のパラメーターとして、クラスのインスタンス(!)がメソッドを呼び出すために、2番目、3番目のパラメーターを取得します。

だから、あなたが実際にあなたのコードで呼び出そうとしているのは、

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