Java.lang.IillegalargumentException: Objekt ist keine Instanz der Deklaration der Klasse, wenn ich Reflexion verwende

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

  •  25-08-2022
  •  | 
  •  

Frage

Ich bin neu in Java Reflection. Ich habe versucht, eine Methode von mir anzurufen DAO Klasse mit Reflexion, und ich habe den folgenden erwähnten Fehler der illegalen Argument -Ausnahme erhalten. Unten ist mein Code. Meine Methode enthält zwei Argumente: eines ist Dossier Bean -Objekt und ein anderer ist sessionfactory Objekt. Ich habe diesen Fehler bekommen, als ich meine Methode aufgerufen habe. Ich habe Los im Netz gesucht, aber nicht die richtige Lösung gefunden.

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

Mein anforderter Wert ist :: GetReviewerOneDetail.

/** Doerdao -Methode ********/

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


}
War es hilfreich?

Lösung

Kurzversion: Ihnen fehlen das erste Argument in Ihrem Anruf an invoke.

Lange Version: Sie rufen an

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

Nehmen wir an, der Wert von requestedUser ist getReviewerOneDetail, Dann würden Sie die Methode nachschlagen

getReviewerOneDetail(Dossier arg0, SessionFactory arg1)

Als nächstes rufst du an

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

Das Javadoc Staaten, die aufgerufen werden, erhält als erster Parameter die Instanz (!) der Klasse, um die Methode auf und als zweite, dritte, ... Parameter die tatsächlichen Parameter für Ihren Aufruf.

Was Sie also tatsächlich in Ihrem Code anrufen möchten, ist also

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

Dies stimmt weder mit der Methodensignatur (1 Parameter vs. 2 Parameter) noch mit dem Instanztyp überein, auf dem die Methode aufgerufen wird (Dossier Anstatt von DoerDAO).

Weil du das erwerben Method von dem DoerDAO Klasse, ich denke, was Sie dort schreiben wollten, war eigentlich:

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

Dies würde sich umsetzen lassen

doerDao.getReviewerOneDetail(dossierDetail.get(0), sessionFactory);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top