2016-12-09 2 views
0

я хочу использовать отражение на родовом типаява getMethod() на общий тип

У меня есть этот класс

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

и в мой контроллер

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

, но я получаю

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

java поиск по родовому типу pe e не по типу, который я использую в конструкторе

Я ожидаю, что поиск будет сделан по типу, который я провожу в контроллере. В классе GeoRegion существует метод.

это SysMyAbDao

public abstract class SysMyAbDao<T, E, Id extends Serializable> { 
    protected String message; 
    protected Boolean status; 
    protected T t ; 
    protected Logger logger; 
    protected Long totalRow; 
    private Class<T> type; 

    public SysMyAbDao(Class<T> type){ 
     this.type = type; 
    } 
    ..... 

GeoRegion класс

public class GeoRegion implements java.io.Serializable { 

    private int idRegion; 
    private String name; 
    private String code; 
    private Set<GeoProvince> geoProvinces = new HashSet<GeoProvince>(0); 
    private Set<GeoCity> geoCities = new HashSet<GeoCity>(0); 

    public GeoRegion() { 
    } 


    public GeoRegion(int idRegion) { 
     this.idRegion = idRegion; 
    } 
    public GeoRegion(int idRegion, String name, String code, Set<GeoProvince> geoProvinces, Set<GeoCity> geoCities) { 
     this.idRegion = idRegion; 
     this.name = name; 
     this.code = code; 
     this.geoProvinces = geoProvinces; 
     this.geoCities = geoCities; 
    } 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name="id_region", unique=true, nullable=false) 
    public int getIdRegion() { 
     return this.idRegion; 
    } 

    public void setIdRegion(int idRegion) { 
     this.idRegion = idRegion; 
    } 


    @Column(name="name") 
    public String getName() { 
     return this.name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 


    @Column(name="code", unique=true) 
    public String getCode() { 
     return this.code; 
    } 

    public void setCode(String code) { 
     this.code = code; 
    } 

    @OneToMany(fetch=FetchType.LAZY, mappedBy="geoRegion") 
    public Set<GeoProvince> getGeoProvinces() { 
     return this.geoProvinces; 
    } 

    public void setGeoProvinces(Set<GeoProvince> geoProvinces) { 
     this.geoProvinces = geoProvinces; 
    } 

    @OneToMany(fetch=FetchType.LAZY, mappedBy="geoRegion") 
    public Set<GeoCity> getGeoCities() { 
     return this.geoCities; 
    } 

    public void setGeoCities(Set<GeoCity> geoCities) { 
     this.geoCities = geoCities; 
    } 
} 
+0

Вы можете разместить код для класса 'GeoRegion'? – developer

+0

@javaguy опубликовано – ciro

ответ

0

Вы пытаетесь вызвать свой метод на single, который является объектом Class.

Я не вижу никаких примеров GeoRegion в этом коде. Но для того, чтобы это работало, вам нужно использовать этот метод на одном из них:

E instance = getSomeObjectFromSomewhere(); 
optionList.put((String)idMethod.invoke(instance),(String)labelMethod.invoke(instance)); 
+0

Я не знаю, если класс i GeoRegion или другой класс – ciro

+0

Да, вы правы. Обновленный ответ соответственно. –

2

Вы имеете в этой строке дополнительный getClass():

Method labelMethod = this.entity.getClass().getMethod(labelName); 

В самом деле, вы звоните getClass() на объект Class<E>. А поскольку класс Class<E> не E, а java.lang.Class вы получаете NoSuchMethodException вы отправили.

Также экземпляр, на который вы ссылаетесь, на ваш метод (single в вашем случае), должен быть типа E, а не типа Class<E>.

В целом вы бы в конечном итоге с чем-то вроде:

public SelectOption(SysMyAbDao<E, ?, ? extends Serializable> dao, 
        Class<E> entityClass, 
        String idName, 
        String labelName) { 
    this.dao = dao; 
    this.entityClass = entityClass; 
    this.entityAll = dao.findAll(); // make sure your SysMyAbDao<E, ?, ?>#findAll() returns a Collection<E> 
    try{ 
     Method idMethod = this.entityClass.getMethod(idName); 
     Method labelMethod = this.entityClass.getMethod(labelName); 
     for (E instance : entityAll) { 
      optionList.put((String)idMethod.invoke(instance),(String)labelMethod.invoke(instance)); 
     } 
    } catch (NoSuchMethodException ex){ 
     ... 
    } 
} 
+0

не работает beacose SysMyAbDao является абстрактным и универсальным классом. отредактируйте вопрос с кодом – ciro

+0

@ciro: Тогда вы должны исправить тип своего параметра dao. Я предположил, что первый общий тип - тот, который возвращается методом 'findAll()' в измененном коде выше. –

+0

в каком виде пожалуйста? – ciro

Смежные вопросы