vendredi 9 décembre 2016

java getMethod() on generic type

i want use reflection on generic type

i have this class

package it.ciro.service;

import it.ciro.dao.SysMyAbDao;
import org.apache.log4j.Logger;

import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by ciro on 09/12/2016.
 */
public class SelectOption<E extends Serializable> {

    private SysMyAbDao dao;
    private Class<E> entity;
    private ArrayList<Class<E>> entityAll;
    private Map<String,String> optionList = new HashMap<String,String>();
    protected Logger logger;

    public SelectOption(SysMyAbDao dao,Class<E> entity,String idName, String labelName ){
        logger  = Logger.getLogger(this.getClass());

        this.dao = dao;
        this.entity = entity;
        entityAll = dao.findAll();
        try{
            Method idMethod = this.entity.getMethod(idName);
            Method labelMethod = this.entity.getClass().getMethod(labelName);
            for (Class<E> single : entityAll) {
                optionList.put((String)idMethod.invoke(single),(String)labelMethod.invoke(single));
            }
        }catch (NoSuchMethodException ex){
            ex.printStackTrace();
            logger.error(ex.getMessage());
        } catch (InvocationTargetException e) {
            logger.error(e.getMessage());
        } catch (IllegalAccessException e) {
            logger.error(e.getMessage());
        }
    }

    public Map<String, String> getOptionList() {
        return optionList;
    }
}

and in my controller

SelectOption<GeoProvince> selectOption = new SelectOption(geoRegionDao,GeoRegion.class,"idGeoRegion","name");   

but i get

java.lang.NoSuchMethodException: java.lang.Class.idGeoRegion()

java search on generic type e not on type that I use in constructor

I expect the search to be made about the type I spend in controller. In GeoRegion class the method exists.





Aucun commentaire:

Enregistrer un commentaire