java.lang.illegalargumentexception : 객체는 반사를 사용할 때 클래스를 선언하는 인스턴스가 아닙니다.

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

  •  25-08-2022
  •  | 
  •  

문제

나는 Java Reflection을 처음 사용합니다. 나는 나의 방법을 나의 방법을 부르려고했다 DAO 반사를 사용하는 클래스와 나는 불법 인수 예외의 아래 언급 된 오류를 얻었습니다. 아래는 내 코드입니다. 내 방법에는 두 가지 인수가 포함되어 있습니다. 하나는 Dossier Bean 객체이고 다른 하나는 IS입니다. 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;
}

내 요청에 따라 값은 다음과 같습니다.

/** 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 호출 된 상태는 클래스의 인스턴스 (!)를 첫 번째 매개 변수로 가져와 메소드를 호출하고 두 번째, 세 번째, ... 매개 변수는 호출의 실제 매개 변수입니다.

그래서, 당신이 실제로 당신의 코드에서 전화하려고하는 것은

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